验证回叫错误

时间:2017-03-27 21:33:52

标签: javascript authentication routes passport.js mean-stack

我的网页https://localhost:3000/#/loginhttps://localhost:3000/#/new正常工作,https://localhost:3000/#/new有一个按钮,可以通过passportjs进行Facebook登录。以下是相关代码:

auth.js

module.exports = {
    'facebookAuth': {
        'clientID': '1416536398420xxx',
        'clientSecret': '...',
        'callbackURL': 'https://localhost:3000/#/auth/facebook/callback'
    }
}

passport.js

passport.use(new FacebookStrategy({
    clientID: configAuth.facebookAuth.clientID,
    clientSecret: configAuth.facebookAuth.clientSecret,
    callbackURL: configAuth.facebookAuth.callbackURL
},
    function (accessToken, refreshToken, profile, done) {
        process.nextTick(function () {
            User.findOne({ 'facebook.id': profile.id }, function (err, usr) {
                if (err) return done(err);
                if (user) return done(null, user);
                else {
                    var newUser = new User();
                    newUser.facebook.id = profile.id;
                    newUser.facebook.token = accessToken;
                    newUser.facebook.name = profile.name.givenName + ' ' + profile.name.familyName;
                    newUser.facebook.email = profile.emails[0].value;
                    newUser.save(function (err) {
                        if (err) throw err;
                        return done(null, newUser)
                    })
                }
            })
        })
    }
));

index.js

router.get('/auth/facebook', passport.authenticate('facebook', { scope: ['email'] }));

router.get('/auth/facebook/callback',
  passport.authenticate('facebook', { successRedirect: '/login',
                                      failureRedirect: '/login' }));

通过点击Facebook登录按钮,它会重定向到Facebook登录页面,输入用户名和密码后,地址变为https://localhost:3000/?code=AQCh9Q9KgZjL3TzTpyMW61gxcNZjN2vEgQAvr5r1k9-WxjwfmVzsPL9Txu-oTkP08MJXyvmJiGEt8zrgHGjLAbpg3SsvCGQEM1jdxwj4YUGL5dmUU3Xm7JZZfUOcCqaGuLSEFcfX-s62-X6uUuPS0D62wWzrAI-NK6gdvudl_JzWBK2O5ptdhGhN8PbbLytGpySEsIY8VVKaI55Tu6fjYA9v2R7Fp_7R2c4krdhA8Pp2A3Z9dQDpg42cZLzxuUtDVqxaPHFNZOufETiE23GxSCObjdq_oSmWkgAVOH1sa2EtPzjawohDZllNmNF-8iGLQQ0#/auth/facebook/callback

结果,它挂起;页面是空白的。

有谁知道我的路线有什么问题?

修改1:我刚刚添加了Valid OAuth redirect URIs,但我仍然可以通过#/auth/facebook/callbak完成网址。

enter image description here

2 个答案:

答案 0 :(得分:2)

这就是查询params(搜索)和哈希工作的方式。

哈希参数不会传递给服务器,它对客户端很有用。并且查询优先于哈希。

您可以在浏览器中自行尝试。打开任何网页(我在这里假设localhost),并使用控制台强制在URL中使用查询参数,哈希参数

window.location.hash = 'someHash'

网址将更新为localhost/#someHash

现在做

window.location.search = 'someQueryParam=value'

请注意,网址更改为localhost/?someQueryParam=value#someHash

唯一可以实现此目的的方法是使用不带#符号的路由器。哈希路由器只是客户端。

这与Facebook回拨网址或护照无关。

我希望这会有所帮助。

答案 1 :(得分:1)

您的路由器正在URL路径的根目录中查找/auth/facebook/callback。我不知道为什么,但Facebook将其代码放在URL的根目录。

按如下方式更改路由器

   router.get(/auth\/facebook\/callback$/,
      passport.authenticate('facebook', { successRedirect: '/login',
                                  failureRedirect: '/login' }));