出于某种原因,在我的 NodeJS Express 应用程序上,当通过 Facebook 的 PassportJS 库进行身份验证时,无论身份验证成功并返回配置文件数据,对 request.isAuthenticated()
的调用总是返回错误
。
我已经声明了我的身份验证回调以在成功时重定向到 /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 的代码表明它不会在请求中存储用户数据,除非您在声明身份验证中间件时在选项字典中指定 assignProperty
。这是它在调用 isAuthenticated()
时尝试访问的同一属性,因此因为它从不存储此数据,所以它总是声称我未通过身份验证。
不幸的是,指定此键会搞砸 Express 的路由匹配,这会导致处理回调 URL 时出现 404 错误,因为检查 assignProperty
的代码会立即转移到处理下一个可用路由。
我已将完整代码添加到 pastie .如果有人能就此提供任何帮助,我将不胜感激。
最佳答案
尝试将 cookieParser
和 session
中间件移动到 Passport 中间件之前:
app.use(express.cookieParser());
app.use(express.session({ secret: '--- OMMITTED ---' }));
app.use(passport.initialize());
app.use(passport.session());
原因是Express按照声明的顺序执行中间件。在您当前的情况下,请求在 cookie/ session 中间件(Passport 中间件所依赖的)之前命中 Passport 中间件。
(顺便说一句,bodyParser()
中间件也是如此,尽管您的路由目前并不依赖它)
关于javascript - 即使身份验证成功,PassportJS Facebook 登录 isAuthenticated 也会返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21365816/