2012-12-23 24 views
30

Próbuję zintegrować sesje Redis z moim systemem uwierzytelniania zapisanym w pliku Node.js.Jak zapisać i pobrać sesję z Redis

Udało mi się pomyślnie skonfigurować serwer Redis, connect-redis i serwer Express.

Oto moja konfiguracja (tylko ważne bit):

var express = require("express"); 
var RedisStore = require("connect-redis")(express); 
var redis = require("redis").createClient(); 

app.use(express.cookieParser()); 
app.use(express.session({ 
    secret: "thisismysecretkey", 
    store: new RedisStore({ host: 'localhost', port: 6379, client: redis }) 
})); 

Teraz ... Jak mogę faktycznie tworzyć, czytać i zniszczyć sesję? Przeczytałem mnóstwo artykułów o tym, jak skonfigurować connect-redis i wiele pytań tutaj na SO, ale przysięgam, każdy zatrzymuje się na samej konfiguracji i nie wyjaśnia, jak go faktycznie używać ...

Jestem świadomy, że to jest prawdopodobnie bardzo prosty, ale proszę nie zgłaszaj i po prostu wyjaśnij :).

Odpowiedz

19

To powinno być wszystko, co do niego należy. Dostęp do sesji w procedurach obsługi tras odbywa się przez req.session. Sesje są tworzone, zapisywane i niszczone automatycznie.

Jeśli chcesz ręcznie utworzyć nową sesję dla użytkownika, zadzwoń pod numer req.session.regenerate().

Jeśli chcesz zapisać je ręcznie, możesz zadzwonić pod numer req.session.save().

Jeśli chcesz je zniszczyć ręcznie, możesz zadzwonić pod numer req.session.destroy().

Aby uzyskać pełną listę metod i właściwości, zobacz stronę the Connect documentation.

4

Rozważ ten kod.

var express = require('express'); 
var redis = require("redis"); 
var session = require('express-session'); 
var redisStore = require('connect-redis')(session); 
var bodyParser = require('body-parser'); 
var client = redis.createClient(); 
var app = express(); 

app.set('views', __dirname + '/views'); 
app.engine('html', require('ejs').renderFile); 

app.use(session({ 
    secret: 'ssshhhhh', 
    // create new redis store. 
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl : 260}), 
    saveUninitialized: false, 
    resave: false 
})); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 

app.get('/',function(req,res){ 
    // create new session object. 
    if(req.session.key) { 
     // if email key is sent redirect. 
     res.redirect('/admin'); 
    } else { 
     // else go to home page. 
     res.render('index.html'); 
    } 
}); 

app.post('/login',function(req,res){ 
    // when user login set the key to redis. 
    req.session.key=req.body.email; 
    res.end('done'); 
}); 

app.get('/logout',function(req,res){ 
    req.session.destroy(function(err){ 
     if(err){ 
      console.log(err); 
     } else { 
      res.redirect('/'); 
     } 
    }); 
}); 

app.listen(3000,function(){ 
    console.log("App Started on PORT 3000"); 
}); 

Więc trzeba zainstalować connect-Redis i zdać ekspresowej sesji wystąpienie do niego.

Następnie w oprogramowaniu middleware zainicjuj redisStore z takimi danymi serwera.

app.use(session({ 
    secret: 'ssshhhhh', 
    // create new redis store. 
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl : 260}), 
    saveUninitialized: false, 
    resave: false 
})); 

kładę TTL do 260, można zwiększyć. Po osiągnięciu limitów TTL automatycznie usunie klucz redis.

W routerach można użyć zmiennej req.session do SET, EDIT lub ZNISZCZENIE sesji.

Jeszcze jedno ...

Jeśli chcesz niestandardowy ciastko tzn nie tak samo jak w sklepie Redis można użyć cookie-parser ustawić tajemnice cookie.

Mam nadzieję, że to pomaga.

link: https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/

Powiązane problemy