web-dev-qa-db-ja.com

Passport-Facebook認証は、すべての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:[''、 '']

47
AMT

次の2つのことがコードに含まれていることを確認してください。

  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つの確認済みメールアドレスを持っている場合のみです。

Weftが指摘したように、emailの代わりにプロパティemailsを使用する必要があるかもしれません。

104
Forivin

認証するときは、これに似たものを使用してください。認証時にスコープでadd 'email'を使用する必要があります。

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

それは私のために働いています。

ここに私を助けたいくつかのリンクがありました。

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

25
sifxtreme

ここにさらに情報を追加したいと思います。

FacebookStrategyとpassport.authorize('facebook', { scope : ['email'] })の作成中にprofileFields: ['emails']を追加すると、ほとんどのユーザーの問題が解決します。

認証後にユーザーのメールが届かない他の理由が考えられます。

  • アカウントにメールアドレスがありません
  • アカウントに確認済みのメールアドレスがありません
  • アカウントに確認済みのメールアドレスがありません
  • ユーザーが電子メールアドレスの再確認を要求するセキュリティチェックポイントを入力しましたが、まだ確認していません
  • ユーザーの電子メールアドレスに到達できません

ユーザーが上記の問題を抱えていないことを確認する必要があります。より多くの情報を見つけることができます https://developers.facebook.com/bugs/1802930019968631/

7
vinesh

パスポートが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"
}

JSON URLを解析できるようにpassport.jsファイルにリクエストモジュール($ npm install request --save)をインストールします。

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

passport-facebookサイトで例として提供されているコード を開始点として使用できます。次に、電子メールにアクセスするには、必ず @ Forivin's answer を確認してください。

0
marcelocra