web-dev-qa-db-ja.com

パスポート-範囲内であってもFacebookがメールを提供しない

私のアプリケーションでは、次のようにfacebook-strategieを登録します。しかし、返されたプロファイルには、email-fieldが含まれていません。

passport.use(new FacebookStrategy({
        clientID: config.facebook.clientID,
        clientSecret: config.facebook.clientSecret,
        callbackURL: config.facebook.callbackURL,
        passReqToCallback: true
    },
    function(req, accessToken, refreshToken, profile, done) {
        // No email in the following colsole.log
        console.log(JSON.stringify(profile));
    }));

取得は次のとおりです。

app.get('/oauth/facebook', passport.authenticate('facebook', {
    failureRedirect: '/login',
    scope:['email']
}));

(だから私はここで言ったようにスコープを使用しています: パスポート-Facebookは電子メールを受け取りません

FB-ログインページで、iamは電子メールを要求しました、そして私はそれを提供します: enter image description here

どんな助けでも非常に感謝しています!

19
Rentrop

FacebookグラフAPIv2.4から、取得するフィールドを明示的に指定する必要があります。

Graph API v2.4の紹介

したがって、次のように書くことができます。

  passport.use(new FacebookStrategy({
      clientID: config.facebook.clientID,
      clientSecret: config.facebook.clientSecret,
      callbackURL: config.facebook.callbackURL,
      profileFields: ['id', 'email', 'gender', 'link', 'locale', 'name', 'timezone', 'updated_time', 'verified'],
    },
65
Tsuneo Yoshioka

コードのコールバック部分はありますか?:

app.get('/oauth/facebook/callback', passport.authenticate('facebook', {
    failureRedirect: '/login',
    successRedirect: '/',
    scope:['email']
}));

そして、はい、確かに、これはあなたのリンクとこれからの指示に従ってscope:['email']で行われるべきです ここでも

2
Nikola

スコープを指定する必要があります: "email"。以下のコードを参照してください。

Facebook認証ルート:

// auth facebook
router.get("/auth/facebook", passport.authenticate("facebook", {
  scope: "email"
}));

facebookStrategyを構成するときに、profileFieldsも指定する必要があります。

passport.use(new FacebookStrategy({
  callbackURL: "http://localhost:5000/auth/facebook/redirect",
  clientID: keys.facebook.clientID,
  clientSecret: keys.facebook.clientSecret,
  profileFields: ['id', 'displayName', 'photos', 'email', 'gender', 'name']
}, (accessToken, refreshToken, profile, done) => {
   // logic 
}))
0
Amit Fegade