【问题标题】:Passport-Facebook not providing email even if it is in scopePassport-Facebook 不提供电子邮件,即使它在范围内
【发布时间】:2015-09-25 13:27:24
【问题描述】:

在我的应用程序中,我注册了 facebook-strategie,如下所示: 但是返回的配置文件不包含电子邮件字段....

passport.use(new FacebookStrategy({
        clientID: config.facebook.clientID,
        clientSecret: config.facebook.clientSecret,
        callbackURL: config.facebook.callbackURL,
        passReqToCallback: true
    },
    function(req, accessToken, refreshToken, profile, done) {
        // No email in the following colsole.log
        console.log(JSON.stringify(profile));
    }));

get如下:

app.get('/oauth/facebook', passport.authenticate('facebook', {
    failureRedirect: '/login',
    scope:['email']
}));

(所以我使用这里所说的范围:Passport-facebook doesn't get email

在 FB 登录页面上,我什至要求提供电子邮件,我确实提供了它:

非常感谢任何帮助!

【问题讨论】:

  • 您还需要询问电子邮件字段
  • 我该怎么做?我以为我会用scope:['email']
  • scope:['email'] 是您想要的权限。当您致电 /me 时,您需要执行 /me?fields=email

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


【解决方案1】:

从 Facebook graph APIv2.4 开始,我们需要明确指定要获取的字段。

Introducing Graph API v2.4

所以,我们可以这样写:

  passport.use(new FacebookStrategy({
      clientID: config.facebook.clientID,
      clientSecret: config.facebook.clientSecret,
      callbackURL: config.facebook.callbackURL,
      profileFields: ['id', 'email', 'gender', 'link', 'locale', 'name', 'timezone', 'updated_time', 'verified'],
    },

【讨论】:

  • 我很惊讶官方的 passport.js 文档中没有提到这一点。
【解决方案2】:

你确实有代码的回调部分,对吧?:

app.get('/oauth/facebook/callback', passport.authenticate('facebook', {
    failureRedirect: '/login',
    successRedirect: '/',
    scope:['email']
}));

而且,是的,确实,这应该使用scope:['email'] 完成,按照您的链接和这个here also 中的说明。

【讨论】:

  • 是的,我也有回拨邮件...这很奇怪
【解决方案3】:

您需要指定范围:“电子邮件”。 参考以下代码。

Facebook 认证路径:

// auth facebook
router.get("/auth/facebook", passport.authenticate("facebook", {
  scope: "email"
}));

在配置 FacebookStrategy 时,您还需要指定 profileFields。

passport.use(new FacebookStrategy({
  callbackURL: "http://localhost:5000/auth/facebook/redirect",
  clientID: keys.facebook.clientID,
  clientSecret: keys.facebook.clientSecret,
  profileFields: ['id', 'displayName', 'photos', 'email', 'gender', 'name']
}, (accessToken, refreshToken, profile, done) => {
   // logic 
}))

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多