Nodejs + Passport.js + Redis: 如何将会话存储在Redis中

16

我阅读了这个话题Node.js + express.js + passport.js : stay authenticated between server restart,我需要完全相同的东西,但是用于 Redis。我使用了这样的代码:

var RedisStore = require('connect-redis')(express);
app.use(express.session({
    secret: "my secret",
    store: new RedisStore,
        cookie: { secure: true, maxAge:86400000 }
}));

连接Redis失败。我使用connect-redis模块进行连接。我做错了什么?谢谢!

更新:我没有收到任何错误提示。为确保授权过程成功,我添加了日志行,并且它执行了。

function(email, password, done) {
    // asynchronous verification, for effect...
    process.nextTick(function() {
        findByEmail(email, function(err, user) {
            if (!user) {
                return done(null, false, {
                    message: 'Unknown user ' + email
                });
            }
            if (user.password != password) {
                return done(null, false, {
                    message: 'Invalid password'
                });
            }
            //just logging that eveything seems fine
            console.log("STATUS: User " + email + " authentificated succesfully");
            return done(null, user);
        })
    });
}));

启用express.logger()后记录为:

127.0.0.1 - - [Fri, 19 Oct 2012 05:49:09 GMT] "GET /ico/favicon.ico HTTP/1.1" 404 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4"
STATUS: User admin authentificated succesfully

确实认为auth/users/credentials/serializing/deserializing本身没有问题。问题只是passport不能将cookie设置到Redis并读取它。


什么不起作用?你遇到了什么错误? - Max
“Passport无法将cookie设置到Redis,并读取它。” 这没有意义。 - Ben
3个回答

6

我应该使用

cookie: { secure: false, maxAge:86400000 }

4
设置 secure: false 的意思是你的会话 cookie 可以在没有 SSL 的情况下发送,这会使你容易受到会话劫持攻击的威胁。详见:http://en.wikipedia.org/wiki/Session_hijacking - Alan
你可以在开发过程中这样做,但确保在生产环境中将安全设置为true。你可以使用环境变量相当容易地实现这一点。 - Porlune
2
听起来并不太公平,假设问题“如何在 Redis 中存储会话”仅适用于将 secure 设置为 false。这是针对您的使用情况。 - alexndreazevedo

1
尝试这个,不要将express传递给const RedisStore,而是传递session。
const redis = require('redis');
const session = require('express-session');
const redisStore = require('connect-redis')(session);
const cookieParser = require('cookie-parser');
const app = require('../app');


app.app.use(cookieParser("secret"));


const rediscli = redis.createClient();


app.app.use(session({
    secret: 'secret',
    store: new redisStore({
        host: '127.0.0.1',
        port: 6379,
        client: rediscli,
        ttl: 260
    }),
    saveUninitialized: false,
    resave: false
}));

0

当您明确设置存储时会发生什么?例如,在您的应用程序中使用以下内容:

var redis = require('redis');
// This is host and port-dependent, obviously
var redisClient= redis.createClient(6379, 'localhost');

app.use(express.session({
    secret: 'your secret',
    /* set up your cookie how you want */
    cookie: { maxAge: ... },
    store: new (require('express-sessions'))({
        storage: 'redis',
        instance: redisClient
    })
}));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接