Passport-Facebook身份validation不提供所有Facebook帐户的电子邮件

我正在使用Passport-Facebook身份validation。

   passport.use(新FacebookStrategy({
             clientID:'CLIENT_ID',
             clientSecret:'CLIENT_SECRET',
             callbackURL:“http://www.example.com/auth/facebook/callback”
         },
        函数(accessToken,refreshToken,profile,done){            
             process.nextTick(function(){                
               执行console.log(configuration文件)
             });               
         }
     ));

对于一些Facebook帐户,我没有得到email_id,我甚至尝试通过使用一个范围variables如下,但我仍然无法得到email_id。

profileUrl:“”和ProfileFields:['','']

确保这两个东西在你的代码中:

  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 }, 

和这个:

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

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

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

最后一个是数组,所以使用profile.emails[0].value来获取用户的第一个电子邮件地址。

正如shamim reza指出的那样,您可能需要检查profile.emails !== undefined因为如果用户至less有一个经过validation的电子邮件地址,则该属性才存在。

当您进行身份validation时,请使用类似于此的内容。 validation时,您需要在范围内使用添加“电子邮件”。

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

这对我有效。

这里有几个链接帮助我。

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

我想在这里添加更多的信息。

在创buildFacebookStrategy和passport.authorize('facebook', { scope : ['email'] })添加profileFields: ['emails']解决了大多数用户的问题。

还有其他可能的原因,你authentication后不会得到用户的电子邮件。

  • 帐户没有电子邮件地址
  • 帐户中没有确认的电子邮件地址
  • 帐户中没有经过validation的电子邮件地址
  • 用户进入了一个安全检查点,要求他们重新确认他们的电子邮件地址,但他们还没有这样做
  • 用户的电子邮件地址不可用

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

您可以使用在passport-facebook网站中提供的代码作为起点。 然后,要访问电子邮件,请确保检查@ Forivin的答案 。

 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) }); } ));