2012-12-27 7 views
8

Ponieważ nie zdefiniowałem maxAge podczas wywoływania expressServer.use(express.session({params})), okres ważności pliku cookie jest ustawiony jako "Session".Zmień okres ważności plików cookie w Express

Chciałbym dodać funkcję "zapamiętaj mnie" podczas logowania. Jeśli wybrano "zapamiętaj mnie", okres wygaśnięcia zostanie przedłużony do miesiąca.

Jak miałbym to zrobić? Próbowałem po prostu rozszerzyć maxAge, ale to nic nie dało ...

expressServer.get '/blah', (request, response) => 
    request.session.cookie.maxAge = 2592000 
    response.end 'hello there' 

Dzięki za pomoc!

** EDIT **

Próbowałem podejmowania prosty serwer przetestować aktualizację plików cookie użytkownika. Używam Express, 3.0.4

Kiedy odwiedzam 127.0.0.1:9000/blah "wygasa" pole jest nadal "sesja" plik cookie w przeglądarce ...

express = require 'express' 

expressServer = express() 
expressServer.use express.cookieParser() 
expressServer.use express.session 
    secret: 'supersecret' 
    cookie: 
     path: '/' 
     httpOnly: true 

expressServer.get '/', (request, response) => 
    response.end 'hello' 

expressServer.get '/blah', (request, response) => 
    request.session.cookie.maxAge = 3600000 
    response.end 'hello again' 

expressServer.listen 9000 
console.log 'server running' 

Grrrrrrr ....

+0

Jednak gdybym wyczyścić cookies przeglądarki i odwiedzić „/ bla”, w „wygasa” pole jest ustawione prawidłowo. Co ma sens, ponieważ ciasteczko musi być ustawione po raz pierwszy :) – user1161657

+1

Ok ... wydaje się działać TYLKO jeśli aktualizuję sesję ... Więc właśnie dodałem 'request.session.blah = Date()' i rzeczy w magiczny sposób działają? – user1161657

+0

Możesz spróbować [ustawić maxAge z wartością domyślną] (http://www.senchalabs.org/connect/middleware-session.html), a następnie wygasić plik cookie, jeśli pole wyboru nie jest zaznaczone (req.session.cookie .expires = false). – Frank

Odpowiedz

11

mam wyboru, które mówi „zapamiętaj mnie” na stronie/logowanie:

<p class="remember"> 
    <input type="checkbox" id="remember" name="remember" value="1" /> 
    <label for="remember">Remember me</label> 
</p> 

Wtedy w mojej trasie POST do/zalogować zrobić trochę zdrowego rozsądku sprawdzenie i ustawienie sesji jeśli req.body.remember jest ustawiony w przeciwnym razie jego po prostu Okno sesji:

//user is authenticated 
    //set session length 
    if (req.body.remember) { 
    var hour = 3600000; 
    req.session.cookie.maxAge = 14 * 24 * hour; //2 weeks 
    } else { 
    req.session.cookie.expires = false; 
    } 

    req.session.userid = user._id; 

Dodaj następujące kilka wierszy (używam Redis) w app.js:

app.use(express.cookieParser('secret-word')); 
    app.use(express.session({ 
    store: new RedisStore({ 
     host: cfg.redis.host, 
     db: cfg.redis.db 
    }), 
    secret: 'another-secret' 
    })); 
+0

I to aktualizuje plik cookie w przeglądarce klienta? – user1161657

+0

Dla mnie zmienia plik cookie sesji na zapleczu, ale tak naprawdę nic nie zmienia w przeglądarce: "( – user1161657

+0

Uaktualniłem odpowiedź. Używam redis, to wszystko, co musiałem zrobić, aby to zadziałało – chovy

2

znalazłem answer, który wydaje się działać dla mnie; dodaj go na szczyt swoich tras.

app.all '*', (req,res,next) -> 
    if req.method is 'HEAD' or req.method is 'OPTIONS' 
    next() 
    else 
    req.session._garbage = Date(); 
    req.session.touch(); 
    next(); 
3

Ustaw nazwę pliku cookie na wartość, gdzie może to być ciąg lub obiekt przekonwertowany na JSON. Opcja ścieżki domyślnie przyjmuje wartość "/".

res.cookie('rememberme', '1', 
       { expires: new Date(Date.now() + 900000), httpOnly: true }); 

Dla dalszych odniesień następujących link może być stosowany

http://expressjs.com/api.html#res.cookie

5

Jeśli chcesz realizować toczenia sesje cookie-sessions w Express 4, należy skonfigurować oprogramowanie warstwy pośredniej takiego:

app.use(cookieSession({ 
    secret: your_secret, 
    maxAge: your_maxAge, 
    key: 'sessionId' 
})); 

Należy pamiętać, że nie trzeba ustawiać opcji expires.

W celu przedłużenia sesji, wystarczy zmienić go tak:

app.get('*', function (req, res, next) { 
    req.session.foobar = Date.now(); 
    next(); 
} 

pamiętać, że w Express 4 nie ma req.session.touch().

0

lub można spróbować tego, że pracował dla mnie:

if (req.body.remember) 
{ 
    var oneWeek = 7 * 24 * 3600 * 1000; //1 weeks      
    req.session.cookie.expires = new Date(Date.now() + oneWeek); 
    req.session.cookie.maxAge = oneWeek; 
}