【发布时间】:2013-05-27 13:08:33
【问题描述】:
我正在使用带有 facebook 身份验证的节点、快递和护照。
我有以下路线(当/facebook/auth/callback 是回调网址时):
function render(page, req, res) {
var user = null;
if (req.user) {
user = req.user.toObject();
user.isLoggedIn = true;
}
res.render(page, { user: user });
}
app.get('/auth-failure', function (req, res) {
res.render('auth-failure');
});
app.get('/auth-success', function (req, res) {
render('auth-success', req, res);
});
app.get('/facebook/auth', passport.authenticate('facebook', { scope: [ 'email', 'user_about_me', 'publish_actions']}));
app.get('/facebook/auth/callback', passport.authenticate('facebook', { failureRedirect: '/auth-failure', successRedirect: '/auth-success' }));
身份验证成功后,我按预期获得了页面auth-success 视图。但是当身份验证失败并且facebook返回时:
http://localhost:3000/facebook/auth/callback?error_code=2102&error_message=User+is+not+a+test+user+owned+by+the+application#=
我看不到auth-failure 视图!相反,Firefox 将页面返回给我:
在 chrome 中运行时,我收到以下消息:
我尝试检查并更换故障路由器:
app.get('/facebook/auth/callback', function (req, res) {
res.redirect('/auth-failure');
});
这成功地呈现了auth-failure 视图。
passport.js facebook 认证失败有什么问题?
为什么它会返回那个错误页面?
关于@Matt Bakaitis 的评论:
这是我序列化和反序列化函数:
// serialize sessions
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findOne({ _id: id }, function (err, user) {
done(err, user);
});
});
【问题讨论】:
-
看来该示例在 Firefox 中有效。
-
@toiletfreak:我附上了 Firefox 中这种错误行为的图片。
-
您是否更改了 passport.serialize 或 passport.deserialize 代码?
-
您可以尝试使用虚拟主机条目而不是 localhost ,例如: local.example.com 。许多 Facebook sdk 在与 localhost 一起使用时会遇到错误。
-
@Matt Bakaitis:我添加了我的序列化和反序列化代码
标签: javascript node.js facebook express passport.js