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:[''、 '']
次の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.emails[0].value
ユーザーの最初のメールアドレスを取得します。
shamim reza
が指摘したので、profile.emails !== undefined
プロパティが存在するのは、ユーザーが少なくとも1つの確認済みメールアドレスを持っている場合のみです。
Weft
が指摘したように、email
の代わりにプロパティemails
を使用する必要があるかもしれません。
認証するときは、これに似たものを使用してください。認証時にスコープで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
ここにさらに情報を追加したいと思います。
FacebookStrategyとpassport.authorize('facebook', { scope : ['email'] })
の作成中にprofileFields: ['emails']
を追加すると、ほとんどのユーザーの問題が解決します。
認証後にユーザーのメールが届かない他の理由が考えられます。
ユーザーが上記の問題を抱えていないことを確認する必要があります。より多くの情報を見つけることができます 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"
}
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",
}),
);
passport-facebook
サイトで例として提供されているコード を開始点として使用できます。次に、電子メールにアクセスするには、必ず @ Forivin's answer を確認してください。