Passport Facebook策略返回未定义的值

时间:2017-09-01 15:23:41

标签: passport-facebook

我在NextJS应用程序中使用passport-facebook插件,我的测试脚本定义了如下策略:

// 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似乎正在为undefined对象中的大多数密钥返回profile

{ 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。出了什么问题?之前在这里提出了一个非常类似的问题,但没有一个答案(没有接受的答案)解决了这个问题。

1 个答案:

答案 0 :(得分:0)

我没有这个领域的经验,但是通过查看facebook-passport的readme,听起来你需要使用profileFields中的FacebookStrategy。 :

  

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

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

有关完整内容,请参阅Graph API参考的“用户”部分   可用字段集。