护照认证失败导致重定向循环

时间:2013-05-31 16:31:50

标签: javascript node.js facebook express passport.js

我使用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返回页面:

enter image description here

在chrome中运行时,我收到消息: enter image description here

我尝试检查一下,然后将故障路由器更换为:

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);
    });
});

3 个答案:

答案 0 :(得分:1)

我相信这是因为你正在使用自定义回调,需要提供像......这样的res对象。

 app.get('/facebook/auth/callback', function(req, res, next) { 
         passport.authenticate('facebook',..............

答案 1 :(得分:1)

我会启动Fiddler,看看究竟通过电汇发送了什么。

答案 2 :(得分:1)

做更多的研究,因为我也使用passport.js与facebook(和其他人)集成,看起来这可能已经是open issue报告的护照-oauth(护照-facek使用)

记录问题的人在line 98 of the oauth2 code上有错误检查的解决方法:

    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上仔细检查您的设置以及您的localhost列在正确的位置也是一个好主意。另外,请检查以确保Node.js中的所有内容完全匹配。当我在配置字符串中输入拼写错误时,我遇到了来自passport-twitter的问题,因为它没有在Node.js中引发错误但导致我的auth以难以捕获的方式失败。以下是与您拥有相同error_message的人的一些链接,他们似乎表明了Facebook方面的配置问题: