簡體   English   中英

Passport-Facebook 身份驗證並未為所有 Facebook 帳戶提供電子郵件

[英]Passport-Facebook authentication is not providing email for all Facebook accounts

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

確保這兩件事在你的代碼中:

  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

當您進行身份驗證時,請使用與此類似的內容。 進行身份驗證時,您需要在范圍內使用 add '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

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

在創建 FacebookStrategy 時添加profileFields: ['emails']passport.authorize('facebook', { scope : ['email'] })解決了大多數用戶的問題。

還有其他可能的原因導致您在身份驗證后無法收到用戶的電子郵件。

  • 帳戶上沒有電子郵件地址
  • 帳戶上沒有確認的電子郵件地址
  • 帳戶上沒有經過驗證的電子郵件地址
  • 用戶輸入了一個安全檢查點,要求他們重新確認他們的電子郵件地址,但他們還沒有這樣做
  • 無法訪問用戶的電子郵件地址

您需要確保您的用戶沒有上面列出的任何問題。 可以找到更多信息https://developers.facebook.com/bugs/1802930019968631/

當護照沒有返回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/

確保您在第一個 .authenticate() 調用中提供 scope 參數,而不是回調。

像這樣:

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

您可以使用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)
        });               
    }
));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM