我的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?我搜索了文档,似乎无法弄清楚我哪里出错了。
答案 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
}