护照Facebook策略返回未定义的值



我在NextJS应用中使用Passport-Face Book插件,我的测试脚本定义了以下策略:

// Configure Passport
// ---------------------------------------------------------------
passport.use(new LocalStrategy(User.authenticate()));
passport.use(new FacebookStrategy({
  clientID: process.env.FACEBOOK_APP_ID,
  clientSecret: process.env.FACEBOOK_APP_SECRET,
  callbackURL: process.env.FACEBOOK_APP_CALLBACK,
},
  function (accessToken, refreshToken, profile, done) {
    console.log(profile);
  }
));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
// ---------------------------------------------------------------

我的身份验证路线是:

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

我目前正在尝试使用此操作,就是在成功身份验证后显示Facebook返回的所有值。身份验证的工作原理,但Facebook似乎正在返回profile对象中的大多数键的undefined

{ id: '1234567812345677',
  username: undefined,
  displayName: 'John Doe',
  name:
   { familyName: undefined,
     givenName: undefined,
     middleName: undefined },
  gender: undefined,
  profileUrl: undefined,
  provider: 'facebook',
  _raw: '{"name":"John Doe","id":"1234567812345677"}',
  _json: { name: 'John Doe', id: '1234567812345677' } }

我得到的是displayNameid;其他一切都是undefined。怎么了?以前在这里提出了一个非常类似的问题,但没有一个答案(没有接受答案)提供了问题。

我没有在这方面的经验,但是从查看Facebook-passport的读数中,听起来您需要在FacebookStrategy中使用profileFields。:

Facebook个人资料包含有关用户的大量信息。 默认情况下,并不是返回配置文件中的所有字段。田野 应用程序需要通过设置配置文件来指示 选项。

new FacebookStrategy({
  clientID: FACEBOOK_APP_ID,
  clientSecret: FACEBOOK_APP_SECRET,
  callbackURL: "http://localhost:3000/auth/facebook/callback",
  profileFields: ['id', 'displayName', 'photos', 'email']
}), ...)

请参阅图API参考的用户部分以进行完整 一组可用字段。

最新更新