javascript - 即使身份验证成功,PassportJS Facebook 登录 isAuthenticated 也会返回 false

标签 javascript node.js passport.js

出于某种原因,在我的 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 .如果有人能就此提供任何帮助,我将不胜感激。

最佳答案

尝试将 cookieParsersession 中间件移动到 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/

相关文章:

node.js - 如何配置 passport-github 以在回调时确认用户?

javascript - 如何使用 ES6 方法将这个对象数组转换为字符串?

javascript - 将 Go Regexp 翻译成 Javascript

javascript - 如何在 TypeScript 中修复 "Initializer provides no value for this binding element and the binding element has no default value"?

javascript - 使用 multer 和 angularjs 从文本框中添加名称和原始文件名创建新名称时上传两次

security - 使用 MEAN.js 实现安全性的更好方法是什么

angularjs - Angular/Node/Express/Passport 跨域问题 - 启用 CORS Passport Facebook 身份验证

Javascript 与 C++,相同的代码,不同的结果,这是为什么呢?

javascript - 如果 iframe 已加载,则确认何时选择更改

javascript - 操作 module.exports 和 require