Comment sauvegarder et récupérer la session à partir de Redis
j'essaie d'intégrer les sessions Redis dans mon système d'authentification écrit en noeud.js.
j'ai réussi à configurer serveur Redis, connect-redis
et Express server.
Voici ma configuration (seulement les bits importants):
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 créer, lire et détruire la session? J'ai lu des tonnes d'articles sur la façon de configurer connect-redis
et beaucoup de questions ici, mais je vous jure que chacun s'arrête sur la configuration et ne pas d'expliquer comment l'utiliser effectivement...
je suis conscient que c'est probablement extrêmement simple, mais s'il vous plaît ne pas downvote et juste expliquer :).
3 réponses
cela devrait être tout ce qu'il y a à faire. Vous accédez à la session dans votre gestionnaire de routes via req.session
. Les sessions sont créées, sauvegardées et détruites automatiquement.
si vous devez créer manuellement une nouvelle session pour un utilisateur, appelez req.session.regenerate()
.
Si vous avez besoin d'enregistrer manuellement, vous pouvez appeler req.session.save()
.
si vous devez le détruire manuellement, vous pouvez appeler req.session.destroy()
.
Voir la documentation de connexion pour la liste complète des des méthodes et des propriétés.
considérez 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 connectez-redis;express-session instance.
puis dans middleware initialiser redisStore avec des détails de serveur comme ceci.
app.use(session({
secret: 'ssshhhhh',
// create new redis store.
store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl : 260}),
saveUninitialized: false,
resave: false
}));
j'ai mis ttl à 260, vous pouvez augmenter. Une fois que TTL aura atteint ses limites, il supprimera automatiquement la touche redis.
Dans les routeurs, vous pouvez utiliser req.variable de session pour définir, éditer ou détruire session.
Une chose de plus...
si vous voulez un cookie personnalisé I. e pas aussi identique que dans votre magasin Redis vous pouvez utiliser cookie-analyseur pour mettre les secrets des cookies.
j'Espère que ça aide.
https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/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"