节点Passport会话在后续调用中丢失

Tay*_*Mac 2 node.js passport.js

我相信我已经正确配置了一切:

app.configure(function() {
    app.use(express.cookieParser('secret message')); // secret it set here in new version of express or connect
    app.use(express.bodyParser());
    app.use(express.session());
    app.use(passport.initialize());
    app.use(passport.session());
});
Run Code Online (Sandbox Code Playgroud)

使用正确的凭据请求"登录" 时:

app.post('/api/login', passport.authenticate('local'), function (req, res, next) {
    console.log(req.session.passport);  // {"user":"5259f2739d4323000a000003"}
});
Run Code Online (Sandbox Code Playgroud)

req.session.passport 填充:

"passport": {"user":"5259f2739d4323000a000003"}
Run Code Online (Sandbox Code Playgroud)

但是,当打电话给:

app.post('/api/checklogin', function (req, res, next) {
    console.log(req.session.passport);  // {}
})
Run Code Online (Sandbox Code Playgroud)

req.session.passport 丢了:

"passport":{}
Run Code Online (Sandbox Code Playgroud)

两次,req.session看起来像这样:

{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}
Run Code Online (Sandbox Code Playgroud)

**如上所述,护照对象明显不同

我假设我已serializeUser正确配置,因为它正确设置了此属性.

我不完全确定Passport如何创建会话cookie,以及这些cookie如何持久化.

我假设req.session.passport应该保留用户属性,但看起来Passport对象:

  1. 每次通话都会重置
  2. 实际上不会在会话中保存Passport属性
  3. 永远不会创建会话

我担心我可能会忽视一些大事 - 可能是我可能需要做的事情,Passport不能直接为我处理.

我不知道有任何方法可以测试会话是否由Passport创建.

任何建议或帮助都非常感谢.这是一个多天的斗争.

Jar*_*son 5

您使用的是群集设置吗?如果是这样,您需要停止使用默认值MemoryStore,并切换到connect-redis之类的内容,以便应用程序的不同实例可以访问共享会话数据.

  • 你能解释实际问题是什么吗?我遇到了完全相同的问题,但是切换到Redis商店并没有解决问题.`deserializeUser`函数仍然不会在顺序调用中调用,会话的`passport`属性也不会从先前序列化的值恢复. (4认同)