node.js - express 3.0 和 Passport 认证

标签 node.js authentication express passport.js

我使用 express@3.0.0beta4 和 passport@0.1.12 并使用本地策略进行身份验证。

一切似乎都工作正常,它正确地重定向成功和失败

app.post('/login', passport.authenticate('local', { failureRedirect: '/' }),
function(req, res) {
  console.log(req.isAuthenticated()); // true
  res.redirect('/users/' + req.user.id );
});

但是如果我在配置文件路由上添加 ensureAuthenticated

app.get('/users/:id', ensureAuthenticated, routes.user);

function ensureAuthenticated(req, res, next) {
  console.log(req.isAuthenticated()); // false
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/');
}

它在登录后将我重定向回“/”(这是登录页面)而不是“/users/id”(用户配置文件)。问题是 req.isAuthenticated() 总是返回 false 并且调试中没有 req.user 变量。

是 express 3 和 passport 交互有问题还是我做错了什么?

最佳答案

我也遇到了类似的问题,但事实证明这是因为我使用的是快速 session 而没有为 session 数据指定数据存储。这意味着 session 数据存储在 RAM 中,并且由于我使用了多个工作人员,因此 session 存储不会在工作人员之间共享。我将我的快速 session 重新配置为使用 RedisStore,并且 isAuthenticated() 开始按预期返回 true。

app.use express.session
    secret: '...'
    store: new RedisStore
      host: redisUrl.hostname
      port: redisUrl.port
      db: ...
      pass: ...

关于node.js - express 3.0 和 Passport 认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11473507/

相关文章:

node.js - 如何为Node中的对象实例添加事件能力?

c# - C# 中的 Grpc 中间件或拦截器

android - 基本认证 android UrlConnection Get

node.js - Mongoose 保存不起作用

node.js - 如何在 React 渲染函数中使用 ejs 变量?

node.js - 如何在 Windows 7 上加密 "npm install"

javascript - node.js 导出模块函数

node.js - socket.io 与私有(private)房间聊天

node.js - Passport.JS - 无需 session 即可授权?

javascript - Express js 路线从未命中/:id