6

ユーザーのログイン時に Facebook から取得しようとしているプロファイル フィールドの一部が通過しません。

ノードでpassportjsを使用しています。これがフェイスブックの戦略です。

passport.use(new FacebookStrategy({
  clientID: FACEBOOK_APP_ID,
  clientSecret: FACEBOOK_APP_SECRET,
  callbackURL: FACEBOOK_CALLBACK_URL,
  profileFields: ['id', 'displayName', 'link', 'about_me', 'photos', 'email']
},
routes.handleLogin
));

で使用されています:

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

その結果、「link」、「about_me」、「email」は取得されず、他のフィールドは取得されません。

4

3 に答える 3

9

profileFields パラメータは、Portable Contacts の規則に準拠しています。これは、'email' の代わりに 'emails' を使用することを意味します。「about_me」フィールドに関しては、passport-facebook がOpenSocialプロトコルを完全にサポートしているようには見えません。これは、これら両方のプロファイル要素に「profileFields」パラメーターを使用したい場合、運が悪いことを意味します。master ブランチから取得した次のコード スニペットは、この制限を示しています。

Strategy.prototype._convertProfileFields = function(profileFields) {
    var map = {
    'id':          'id',
    'username':    'username',
    'displayName': 'name',
    'name':       ['last_name', 'first_name', 'middle_name'],
    'gender':      'gender',
    'profileUrl':  'link',
    'emails':      'email',
    'photos':      'picture'
};
...

このマッピングにリストされているフィールドは、現在サポートされている唯一のフィールドです。

幸いなことに、すべてが失われるわけではありません。profileFields パラメータを使用しないことを選択した場合、奇妙なことに、「bio」というプロパティを介して、関心のある「about_me」コンテンツが送信されます。これにアクセスする方法は次のとおりです。

passport.use(new FacebookStrategy({
  clientID: FACEBOOK_APP_ID,
  clientSecret: FACEBOOK_APP_SECRET,
  callbackURL: FACEBOOK_CALLBACK_URL
},
function(accessToken, refreshToken, profile, done) {
   console.log("bio: " + profile._json.bio);
}));

残念ながら、これはあなたが興味を持っていた他のデータを提供しません。あなたの状況では、パスポートとフェイスブックのコールバック中にサポートされている規則フィールドを収集し、フォローアップ コールで拡張プロファイル フィールドを取得することをおそらく検討していると思います。 Facebook APIを直接使用します。それか、passport-facebook のメンテナに突っ込んでフィールド サポートを拡張してもらいます。

于 2014-03-03T03:56:35.593 に答える