9

我正在使用带有 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);
    });
});
4

3 回答 3

1

我相信这是因为您正在使用自定义回调并且需要提供一个 res 对象,例如......

 app.get('/facebook/auth/callback', function(req, res, next) { 
         passport.authenticate('facebook',..............
于 2013-06-07T04:51:17.050 回答
1

我会启动Fiddler以查看通过网络发送的确切内容。

于 2013-06-09T16:44:28.643 回答
1

做更多的研究,因为我还使用 passport.js 与 facebook(和其他)集成,看起来这可能已经是针对 passport-oauth(passport-facebook 使用)报告的一个未解决的问题。

记录问题的人在 oauth2 代码的第 98 行有一个错误检查的解决方法:

    app.get('/auth/facebook', passport.authenticate('facebook'));
    app.get('/auth/facebook/callback',
            , function(req, res, next) {
                  if (req.query && !req.query.error && req.query.error_code) {
                      req.query.error = true;
                  }
                  next();
            }
            , passport.authenticate('facebook', { failureRedirect: '/auth-failure', successRedirect: '/auth-success' }
     );

为了更好地衡量,最好仔细检查您在 Facebook 上的设置,以及您的本地主机是否列在正确的位置。此外,请检查以确保所有内容都与 Node.js 完美匹配。当我在我的配置字符串中输入了一个很难捕捉的错字时,我遇到了 passport-twitter 问题,因为它没有在 Node.js 中引发错误,但导致我的身份验证以一种难以捕捉的方式失败。以下是与您有相同情况的人的一些链接,error_message它们似乎表明 facebook 端的配置问题:

于 2013-06-10T01:31:39.430 回答