Como gravar e recuperar a sessão do Redis

estou a tentar integrar as sessões Redis no meu sistema de autenticação escrito no nó.js.

consegui configurar com sucesso o servidor Redis, connect-redis e o servidor Express.

Aqui está a minha configuração (apenas a parte importante):

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 })
}));
Agora... Como eu realmente criar, ler e destruir a sessão? Eu li toneladas de artigos sobre como configurar connect-redis e muitas perguntas aqui sobre assim, mas eu juro que cada um pára apenas na configuração e não explica como usa-o mesmo...

estou ciente de que isso é provavelmente extremamente simples, mas por favor não vote baixo e apenas explique :).

Author: Eleeist, 2012-12-24

3 answers

Deve ser só isso. Você acede à sessão em seus tratadores de rotas via req.session. As sessões são criadas, salvas e destruídas automaticamente.

Se precisar de criar manualmente uma nova sessão para um utilizador, ligue para req.session.regenerate().

Se precisar de o gravar manualmente, pode ligar para req.session.save().

Se precisares de o destruir manualmente, podes ligar para o req.session.destroy().

Ver a documentação de ligação para a lista completa dos métodos e propriedades.

 24
Author: JohnnyHK, 2014-01-25 21:30:42

Considere este código.

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

Então você precisa instalar connect-redis e passar a sua instância express-session para ele.

Então no middleware inicializa a redistore com detalhes do servidor como este.

app.use(session({
    secret: 'ssshhhhh',
    // create new redis store.
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl :  260}),
    saveUninitialized: false,
    resave: false
})); 
Se puser TTL a 260, pode aumentar. Após o TTL atingir seus limites, ele irá apagar automaticamente a tecla redis.

Em roteadores você pode usar req.variável de sessão para definir, editar ou destruir a sessão.

Mais uma. coisa...

Se quiser um cookie personalizado, Ou seja, não como na sua loja Redis, pode usar o analisador de cookies para definir os segredos dos cookies.

Espero que ajude.

Ligação: https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/

 7
Author: Shaikh Shahid, 2015-07-29 05:43:48

Também pode usar a ferramenta Redis monitor para ver toda a acção em tempo real! Quando você atualizar seu aplicativo, você verá os dados aparecerem na janela da consola.

redis-cli monitor

Resultado da amostra para as sessões usando o 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
Author: indospace.io, 2018-10-05 02:00:33