Passport-Facebook身份验证不会为所有Facebook帐户提供电子邮件

AMT*_*AMT 47 javascript node.js passport-facebook passport.js

我正在使用Passport-Facebook身份验证.

  passport.use(new FacebookStrategy({
            clientID: 'CLIENT_ID',
            clientSecret: 'CLIENT_SECRET',
            callbackURL: "http://www.example.com/auth/facebook/callback"
        },
        function (accessToken, refreshToken, profile, done) {            
            process.nextTick(function () {                
               console.log(profile)
            });               
        }
    ));

对于一些Facebook帐户,我没有收到email_id,我甚至尝试使用范围变量,如下所示,但我仍然无法获得email_id.

profileUrl:""和ProfileFields:['','']

For*_*vin 107

确保代码中包含以下两项内容:

  passport.use(new FacebookStrategy({
            clientID: 'CLIENT_ID',
            clientSecret: 'CLIENT_SECRET',
            callbackURL: "http://www.example.com/auth/facebook/callback"
            passReqToCallback : true,
            profileFields: ['id', 'emails', 'name'] //This
        },
Run Code Online (Sandbox Code Playgroud)

还有这个:

app.get('/connect/facebook', passport.authorize('facebook', { scope : ['email'] }));
Run Code Online (Sandbox Code Playgroud)

这使您可以访问以下内容:

  • profile.id
  • profile.name.givenName
  • profile.name.familyName
  • profile.emails

最后一个是数组,因此用于profile.emails[0].value获取用户的第一个电子邮件地址.

正如所shamim reza指出的,您可能想要检查是否profile.emails !== undefined因为该属性仅在用户具有至少一个经过验证的电子邮件地址时才存在.

  • 一个人真的需要'profileFields'字段.此外,我不需要passReqToCallback.我在passport-facebook上搜索了它并且它不存在(我猜它没有被使用,所以你可能会把它留下来). (3认同)
  • @ArslArsl 如果登录用户电子邮件未经过验证,则 facebook 不会发送电子邮件字段 (2认同)

sif*_*eme 26

当您进行身份验证时,请使用与此类似的内容.进行身份验证时,您需要在范围中添加"email".

app.get('/auth/facebook',
passport.authenticate('facebook', { scope: ['email']}),
    function(req, res){
});
Run Code Online (Sandbox Code Playgroud)

这对我有用.

以下是一些帮助我的链接.

https://github.com/jaredhanson/passport-facebook/issues/11 https://github.com/jaredhanson/passport-facebook#how-do-i-ask-a-user-for-additional-permissions


vin*_*esh 8

我想在这里添加更多信息.

profileFields: ['emails']创建FacebookStrategy时添加并passport.authorize('facebook', { scope : ['email'] })解决大多数用户的问题.

还有其他可能的原因导致您在身份验证后无法收到用户的电子邮件.

  • 帐户上没有电子邮件地址
  • 帐户上没有确认的电子邮件地址
  • 帐户中没有经过验证的电子邮件地址
  • 用户输入了一个安全检查点,要求他们重新确认他们的电子邮件地址,但他们还没有这样做
  • 用户的电子邮件地址无法访问

您需要确保您的用户没有上面列出的任何问题.可以找到更多信息https://developers.facebook.com/bugs/1802930019968631/