以下のコードに従ってmongodbに保存すると、passport-facebookを介して基本的なユーザー情報を取得できます。
app.get("/auth/facebook", passport.authenticate("facebook", { scope : ["email", "publish_stream", "user_location", "user_hometown", "user_birthday", "read_friendlists"]}));
app.get("/auth/facebook/callback", passport.authenticate("facebook",{ successRedirect: '/', failureRedirect: '/'}));
var mongoose = require('mongoose'),
FacebookStrategy = require('passport-facebook').Strategy,
Users = mongoose.model('Users');
module.exports = function (passport, config) {
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
Users.findOne({ _id: id }, function (err, user) {
done(err, user);
});
});
passport.use(new FacebookStrategy({
clientID: config.facebook.clientID,
clientSecret: config.facebook.clientSecret,
callbackURL: config.facebook.callbackURL
}, function(accessToken, refreshToken, profile, done) {
Users.findOrCreateFaceBookUser(profile, done);
}));};
しかし、「プロフィール」にプロフィール写真が表示されません。
ドキュメント https://github.com/jaredhanson/passport-facebook は、写真を取得するために、以下のようにprofileFieldsを渡す必要があると述べています。しかしそうすることで、私は写真のURLを見ることができますが、_jsonに含まれていた他のデータを失います。 profile._json.location.name。他のユーザー情報をそのままにして写真を取得するにはどうすればよいですか?
passport.use(new FacebookStrategy({
// clientID, clientSecret and callbackURL
profileFields: ['id', 'displayName', 'photos', ....]},// verify callback));
はい、このようなアクセストークンを使用してグラフAPIを介して画像にアクセスできます。 "graph.facebook.com/"; + profile.username + "/ picture" + "?width = 200&height = 200" + "&access_token =" + accessToken;プロファイルフィールドを使用する必要はありません。
より大きな画像が必要な場合(上記のmiksiiの例のデフォルトは50px x 50pxで、かなり小さいです)、次を使用します。
profileFields: ['id', 'displayName', 'name', 'gender', 'picture.type(large)']
その後
picture: profile.photos ? profile.photos[0].value : '/img/faces/unknown-user-pic.jpg'
これにより、そのユーザーの200px x200pxのプロフィール写真が返されます。
あなたの質問の答えに加えて-あなたはそれをそのようにする必要はありません。あなたが言ったように、あなたはFacebookのプロフィールに必要な属性を定義することができます:
clientID: "...",
clientSecret: "...",
callbackURL: "...",
profileFields: ['id', 'displayName', 'name', 'gender', ..., 'photos']
あなたができることは、単に与えられた属性の値をつかむことです。この値を保持する属性を作成するとします。
picture: profile.photos ? profile.photos[0].value : '/img/faces/unknown-user-pic.jpg'
一部のユーザーまたはユーザー名の値が未定義の場合があるため、これはより良い解決策であることが証明されました。
これもお役に立てば幸いです。
ありがとうございました。
この answer なので、このコードでうまく機能します。
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: FACEBOOK_APP_CALLBACK,
profileFields: ['id', 'displayName', 'picture.type(large)', 'email', 'birthday', 'friends', 'first_name', 'last_name', 'middle_name', 'gender', 'link']
}, (accessToken, refreshToken, profile, cb) => {
const picture = `https://graph.facebook.com/${profile.id}/picture?width=200&height=200&access_token=${accessToken}`
//
}))