护照js req.user在req.login后不可用

5
我正在尝试正确设置我的护照会话。在用户注册后,我执行req.login(),然后有一个控制台消息console.log(req.user)。它返回: { email: 'xxxx', password: 'xxxx', id: 0 } 因此,似乎在用户创建后,req.user是可用的。但是,当用户登录时,我有这个路由:
app.post('/login', passport.authenticate('local-login', { failureRedirect: '/login'}),
      function(req, res) {
         console.log(req.user);
         res.redirect('/users');
      }
);

那个控制台消息(来自post调用)返回:
{ id: null,
  email: 'xxxxx',
  password: 'xxxxx' }

如您所见 - 登录后 - 它会重定向到 /users - 这是我的 GET 请求:

app.get('/users', function(req, res){
  console.log(req.user);
  res.render('partials/profile.html');
});

控制台消息返回undefined - 因此req.user未被传递。此外,如果我使用console.log(req.session)检查会话,我会得到:

{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true,
     secure: true },
  passport: {} }

因此,您可以看到 - cookie中没有护照用户,它是一个空集。

我错在哪里了?

谢谢!


2
你是否定义了会话存储? - Dalorzo
1个回答

3

我遇到了同样的问题,我只是在登录后将会话名称设置为用户的名称。然后我就可以在应用程序的其余部分中获取它。

app.post('/login', passport.authenticate('local-login', { failureRedirect: '/login'}),
  function(req, res) {
     console.log(req.user);
     req.session.user = req.user;
     res.redirect('/users');
  }
);

这样你就可以在任何地方访问它。


很酷的解决方法 - 我实际上已经修复了它...我不确定是怎么做到的,但我认为当我执行app.use(session({secret: "my secret:", cookie: secure}));或类似的操作时 - cookie部分搞砸了一切,我想当我删除它时它开始工作了...感谢您的建议...好主意。 - ewizard
我也遇到了完全相同的问题。我在会话中设置了cookie过期时间,但是在删除它后,认证又开始工作了。这是passport的一个bug吗? - Sudhakar
@ewizard 你删除了所有关于cookies的提及吗?能否给我展示一下你具体做了什么? - DatBassie
1
@DatBassie 这是一段时间以前的事情了,所以我无法确切地记得,也不记得我当时正在做什么项目...但我想我只是删除了 cookie: secure - 然后对与 cookie 相关的其余代码进行了必要的处理,以确保它能够执行...抱歉...我记不清楚了。 - ewizard

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