护照JS Facebook登录,虽然身份验证成功,但isAuthenticated返回false。

3

在我的NodeJS Express应用程序中,使用PassportJS库通过Facebook进行身份验证时,无论身份验证是否成功并返回配置文件数据,对request.isAuthenticated()的调用始终返回false

我已经声明了身份验证回调,在成功后重定向到/profile路由,它也成功执行:

app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/profile', failureRedirect: '/' }));

这个路由声明了一个函数,在决定是否继续处理请求之前验证身份认证:

app.get('/profile', ensureAuthenticated, user.list);

该函数的定义如下:

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

正如您所看到的,一切都很简单。我在这里没有做任何特别的事情。

通过步进 PassportJS 的代码,可以发现除非在声明身份验证中间件时在 options 字典中指定 assignProperty,否则它不会在请求中存储用户数据。它试图访问相同的属性来调用 isAuthenticated(),所以因为它从未存储这些数据,它总是声称我没有经过身份验证。

不幸的是,指定此密钥会影响 Express 的路由匹配,导致处理回调 URL 时出现 404 错误,因为检查 assignProperty 的代码立即转到处理下一个可用路由。

我已将完整的代码添加到 pastie 中,链接为pastie。如果有人能提供帮助,我将不胜感激。

1个回答

6

尝试将cookieParsersession中间件移动到Passport中间件之前:

app.use(express.cookieParser());
app.use(express.session({ secret: '--- OMMITTED ---' }));
app.use(passport.initialize());
app.use(passport.session());

这是因为Express按照声明的顺序执行中间件。在您当前的情况下,请求会先经过Passport中间件,然后才是cookie/session中间件(Passport中间件依赖它们)。
(顺便说一句,bodyParser()中间件也是如此,尽管您的路由目前不依赖于它)

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