护照 Facebook 身份验证 Returns 未定义?

Passport Facebook Authentication Returns Undefined?

我的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,在那里他们被提示允许我的应用程序访问他们的数据的权限。一旦接受我的 console.log(profile) 就会触发,但它会打印出 undefined 即使用户接受了许可?我已经搜索了文档,但似乎无法弄清楚我哪里出错了。

似乎是 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
}