56

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

  护照.使用(新FacebookStrategy({
            clientID: 'CLIENT_ID',
            clientSecret: 'CLIENT_SECRET',
            回调URL:“http://www.example.com/auth/facebook/callback”
        },
        函数(accessToken、refreshToken、profile、done){            
            process.nextTick(函数(){                
               控制台日志(配置文件)
            });               
        }
    ));

对于某些 Facebook 帐户,我没有得到 email_id,我什至尝试使用如下范围变量,但我仍然无法得到 email_id。

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

4

7 回答 7

132

确保这两件事在您的代码中:

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

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

  • 个人资料.id
  • profile.name.givenName
  • profile.name.familyName
  • 个人资料.电子邮件

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

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

正如所Weft指出的,您可能必须使用该属性email而不是emails.

于 2015-09-03T08:37:31.143 回答
25

当您进行身份验证时,请使用与此类似的东西。进行身份验证时,您需要在范围内使用添加“电子邮件”。

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

于 2014-07-18T00:54:43.980 回答
8

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

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

还有其他可能的原因,您在身份验证后不会收到用户的电子邮件。

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

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

于 2017-04-01T19:11:39.460 回答
2

当护照不返回profile.emails, profile.name.givenName, profile.name.familyName字段时,或者如果它们丢失,您可以尝试解析https://graph.facebook.com/v3.2/url,尽管您仍然需要一个令牌。您当然可以使用有效的令牌访问 url,例如:

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

它输出一个 JSON 响应,如:

{
   "id": "5623154876271033",
   "name": "Kurt Van den Branden",
   "email": "kurt.vdb\u0040example.com",
   "first_name": "Kurt",
   "last_name": "Van den Branden"
}

安装请求模块 ( $ npm install request --save),以便能够解析 JSON url 并在您的 passport.js 文件中:

const request = require("request");

passport.use(new FacebookStrategy({
        clientID        : 'CLIENT_ID',
        clientSecret    : 'CLIENT_SECRET',
        callbackURL     : "https://example.com/auth/facebook/callback"
    },
    function(req, token, profile, done) {

        let url = "https://graph.facebook.com/v3.2/me?" +
                  "fields=id,name,email,first_name,last_name&access_token=" + token;

        request({
            url: url,
            json: true
        }, function (err, response, body) {
              let email = body.email;  // body.email contains your email
              console.log(body); 
        });
    }
));

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

于 2018-10-28T15:30:55.853 回答
2

确保将范围参数提供给第一个 .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",
    }),
);
于 2019-07-08T12:17:37.177 回答
-1

您可以使用站点中作为示例提供的代码作为passport-facebook起点。然后,要访问电子邮件,请务必查看@Forivin 的答案

于 2017-04-15T19:18:27.567 回答
-3
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)
        });               
    }
));
于 2016-05-29T17:49:09.703 回答