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

时间:2014-04-05 12:26:31

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

我正在使用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:['','']

  

7 个答案:

答案 0 :(得分:98)

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

  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是否属性,因为如果用户至少有一个经过验证的电子邮件地址,则该属性才存在。

答案 1 :(得分:25)

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

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

答案 2 :(得分:7)

我想在此处添加更多信息。

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

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

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

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

答案 3 :(得分:1)

当护照没有返回 '2018-10-28 12:49:00' 字段时,或者如果缺少它们,您可以尝试解析profile.emails, profile.name.givenName, profile.name.familyName网址,尽管您仍然需要令牌。您访问的URL当然带有有效的令牌,例如:

https://graph.facebook.com/v3.2/me?fields=id,name,email,first_name,last_name&access_token=

它输出JSON响应,如:

https://graph.facebook.com/v3.2/

安装请求模块({ "id": "5623154876271033", "name": "Kurt Van den Branden", "email": "kurt.vdb\u0040example.com", "first_name": "Kurt", "last_name": "Van den Branden" } ),以便能够解析JSON URL并在password.js文件中:

$ npm install request --save

您可以向URL添加很多其他参数,尽管其中一些参数需要用户许可才能返回值。您可以在https://developers.facebook.com/tools/explorer/

上玩它

答案 4 :(得分:0)

您可以使用code provided as an example in the passport-facebook site作为起点。然后,要访问电子邮件,请务必选中@Forivin's answer

答案 5 :(得分:0)

确保在第一个.authenticate()调用中提供了范围参数,而不是回调中。

赞:

router.get("/auth/facebook", passport.authenticate("facebook", {
    scope: [ "email" ], // scope goes here, not below
}));

router.get("/auth/facebook/callback",
    passport.authenticate("facebook", {
        successRedirect: "/",
        failureRedirect: "/login",
    }),
);

答案 6 :(得分:-1)

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