Passport Facebook身份验证返回未定义?

时间:2018-05-04 17:59:49

标签: node.js oauth-2.0 passport.js passport-facebook

我的Facebook策略如下:

passport.use(new facebookStrategy({

    clientID: envVars.facebook.clientID,
    clientSecret: envVars.facebook.clientSecret,
    callbackURL: envVars.facebook.callbackURL,
    passReqToCallback : true,
    profileFields: ['id', 'emails', 'displayName']
},

function(token, refreshToken, profile, done) {
    console.log(profile); //prints out undefined
}
));

我的路线按如下方式处理:

router.get('/facebook', passport.authenticate('facebook'));

router.get('/auth/facebook/redirect', passport.authenticate('facebook'), 
function(req, res){
    res.redirect("/profile");
});

我的代码成功完成的操作是将用户引导至Facebook,在Facebook上提示他们允许我的应用访问其数据。一旦被接受,我的console.log(profile)会触发,即使用户接受了权限,它也会打印出undefined?我搜索了文档,似乎无法弄清楚我哪里出错了。

1 个答案:

答案 0 :(得分:1)

似乎是passReqToCallback的问题。请参阅此问题:Using PassportJS, how does one pass additional form fields to the local authentication strategy?

在您的情况下,删除passReqToCallback:true标志。

passport.use(new facebookStrategy({

    clientID: envVars.facebook.clientID,
    clientSecret: envVars.facebook.clientSecret,
    callbackURL: envVars.facebook.callbackURL,
    profileFields: ['id', 'emails', 'displayName']
},

另一个选项是修改你的回调并使用第一个参数,即请求对象。

function(req, email, password, done) {
    // now you can check req.body.foo
}