Nodejs + Passport.js + Redis:如何在 Redis 中存储会话
Posted
技术标签:
【中文标题】Nodejs + Passport.js + Redis:如何在 Redis 中存储会话【英文标题】:Nodejs + Passport.js + Redis: how to store sessions in Redis 【发布时间】:2012-10-08 12:23:49 【问题描述】:我已阅读此主题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 模块。我做错了什么?谢谢!
UPD:我没有收到任何错误。为了确保身份验证过程成功,我添加了日志行,它会执行。
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 本身没有任何问题。问题只是护照无法将 cookie 设置为 Redis 并读取它。
【问题讨论】:
什么不起作用?你遇到了什么错误? "passport 无法将 cookie 设置为 Redis 并读取它。"这没有意义。 【参考方案1】:我应该使用
cookie: secure: false, maxAge:86400000
【讨论】:
设置secure: false
意味着您的会话 cookie 可以在没有 SSL 的情况下发送,从而使您容易受到会话劫持。 en.wikipedia.org/wiki/Session_hijacking
您可以在开发中执行此操作,但请确保在生产中将 secure 设置为 true。你可以很容易地使用环境变量来做到这一点。
假设“如何在 Redis 中存储会话”问题仅适用于将 secure
设置为 false
时,这听起来不太公平。这是适合您的用例。【参考方案2】:
当您明确设置商店时会发生什么?即在您的应用中遵循以下原则:
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
)
));
【讨论】:
【参考方案3】:试试这个,而不是将 express 传递给const RedisStore
pass 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
));
【讨论】:
以上是关于Nodejs + Passport.js + Redis:如何在 Redis 中存储会话的主要内容,如果未能解决你的问题,请参考以下文章
req.user.displayname 未定义 Nodejs + passport = google oauth
nodejs - passport.use 回调返回 dataValues 和 _previousDataValues 而不是普通对象