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

Posted

技术标签:

【中文标题】护照认证失败导致重定向循环【英文标题】:passport authentication failure leads to redirect loop 【发布时间】: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:我添加了我的序列化和反序列化代码 【参考方案1】:

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

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

redirect_uri is not owned by the application Facebook login, redirect_uri is not owned by the application. why? facebook oauth api login problems

【讨论】:

代码有错误?它缺少括号或类似的东西?【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于护照认证失败导致重定向循环的主要内容,如果未能解决你的问题,请参考以下文章

Abp授权失败重定向至登录页,修改为返回401

Laravel 多重保护认证失败

成功认证后的 Spring-SAML 无休止的重定向循环

关于配置Nginx反向代理后SpringSecurity认证失败的问题解决

Spring Security 如果是404直接报错,不要跳转认证?

浦发银行信用卡小程序认证失败怎么回事