4

我正在使用 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 变量。

是快递 3 和护照交互有问题还是我做错了什么?

4

4 回答 4

1

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

app.use express.session
    secret: '...'
    store: new RedisStore
      host: redisUrl.hostname
      port: redisUrl.port
      db: ...
      pass: ...
于 2014-02-01T18:38:00.573 回答
0

我也为这个问题苦苦挣扎了很久。为我解决的问题是更改maxAge会话 cookie 的属性——之前它太低了:

app.use(express.cookieParser()); 
app.use(express.session({
  secret: config.session.secret,
  cookie: {
    maxAge: 1800000, //previously set to just 1800 - which was too low
    httpOnly: true
  }
}));

此更改后,req.isAuthenticated()返回 true

于 2014-08-06T02:05:55.540 回答
0

authenticate() 是中间件。来自文档:

app.post('/login', 
  passport.authenticate('local', { failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/');
  });
于 2012-07-13T16:02:15.567 回答
0

问题是我对其进行了测试curl -L -d "name=Test&password=1"并且curl -L没有按预期工作。但它适用于网络浏览器。

于 2012-07-15T18:38:13.457 回答