web-dev-qa-db-fra.com

Comment sauvegarder et récupérer une session depuis Redis

J'essaie d'intégrer des sessions Redis dans mon système d'authentification écrit en Node.js.

J'ai réussi à configurer le serveur Redis, le connect-redis et le serveur Express.

Voici ma configuration (juste le bit important):

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 })
}));

Maintenant ... Comment puis-je créer, lire et détruire la session? J'ai lu des tonnes d'articles sur la façon de configurer connect-redis et de nombreuses questions sur SO, mais je jure que chacun ne s'arrête que sur la configuration et n'explique pas comment l'utiliser réellement ...

Je suis conscient que c'est probablement extrêmement simple, mais s'il vous plaît, ne vous abaissez pas et expliquez simplement :).

38
Eleeist

Cela devrait être tout ce qu'il y a à faire. Vous accédez à la session dans vos gestionnaires d’itinéraires via req.session. Les sessions sont créées, enregistrées et détruites automatiquement.

Si vous devez créer manuellement une nouvelle session pour un utilisateur, appelez req.session.regenerate().

Si vous devez le sauvegarder manuellement, vous pouvez appeler req.session.save().

Si vous devez le détruire manuellement, vous pouvez appeler req.session.destroy().

Voir la documentation Connect pour la liste complète des méthodes et propriétés.

27
JohnnyHK

Considérons ce code.

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");
});

Vous devez donc installer connect-redis et lui transmettre votre instance express-session.

Ensuite, dans le middleware, initialisez redisStore avec les détails du serveur comme celui-ci.

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

Je mets ttl à 260, vous pouvez augmenter. Une fois que TTL a atteint ses limites, la touche Redis sera automatiquement supprimée.

Dans les routeurs, vous pouvez utiliser la variable req.session pour SET, EDIT ou DESTROY la session.

Encore une chose ...

Si vous souhaitez que les cookies personnalisés ne soient pas les mêmes que dans votre magasin Redis, vous pouvez utiliser cookie-parser pour définir les secrets de cookies.

J'espère que ça aide.

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

9
Shaikh Shahid

Vous pouvez également utiliser l'outil de surveillance Redis pour voir toute l'action en temps réel! Lorsque vous actualisez votre application, les données apparaissent dans la fenêtre de la console.

redis-cli monitor

Exemple de sortie pour les sessions utilisant tj/connect-redis

1538704759.924701 [0 unix:/tmp/redis.sock] "expire" "sess:F9x-YgbgXu1g7RG8tFlkwY3RV0JzHgCh" "3600"
1538704759.131285 [0 unix:/tmp/redis.sock] "get" "sess:F9x-YgbgXu1g7RG8tFlkwY3RV0JzHgCh"
1538704787.179318 [0 unix:/tmp/redis.sock] "set" "sess:Hl3LPbOBdKO44SG4zQHFn2gfdiWTwzWW" "{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2018-10-05T02:59:47.178Z\",\"secure\":true,\"httpOnly\":true,\"domain\":\".indospace.io\",\"path\":\"/\"},\"path\":\"/\",\"userAgent\":{\"family\":\"NewRelicPingerBot\",\"major\":\"1\",\"minor\":\"0\",\"patch\":\"0\",\"device\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"},\"os\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"}},\"ip\":\"184.73.237.85\",\"page_not_found_count\":0,\"city\":\"Ashburn\",\"state\":\"VA\",\"city_state\":\"Ashburn, VA\",\"Zip\":\"20149\",\"latitude\":39.0481,\"longitude\":-77.4728,\"country\":\"US\"}" "EX" "3599"
1538704787.179318 [0 unix:/tmp/redis.sock] "set" "sess:Hl3LPbOBdKO44SG4zQHFn2gfdiWTwzWW" "{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2018-10-05T02:59:47.178Z\",\"secure\":true,\"httpOnly\":true,\"domain\":\".indospace.io\",\"path\":\"/\"},\"path\":\"/\",\"userAgent\":{\"family\":\"NewRelicPingerBot\",\"major\":\"1\",\"minor\":\"0\",\"patch\":\"0\",\"device\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"},\"os\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"}},\"ip\":\"184.73.237.85\",\"page_not_found_count\":0,\"city\":\"Ashburn\",\"state\":\"VA\",\"city_state\":\"Ashburn, VA\",\"Zip\":\"20149\",\"latitude\":39.0481,\"longitude\":-77.4728,\"country\":\"US\"}" "EX" "3599"
0
indospace.io