我可以通过passport-facebook检索基本用户信息,按照以下代码并保存在mongodb中:
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的照片,如下所示。但是这样做,我能够看到照片网址,但却丢失了_json中包含的其他数据,例如profile._json.location.name。如何检索包含其他用户信息的照片?
passport.use(new FacebookStrategy({
// clientID, clientSecret and callbackURL
profileFields: ['id', 'displayName', 'photos', ....]},// verify callback));
答案 0 :(得分:19)
如果您需要更大的图像(上面的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 x 200px个人资料图片。
答案 1 :(得分:14)
除了回答你的问题之外 - 你不必这样做。如您所述,您可以为Facebook个人资料定义所需的属性:
clientID: "...",
clientSecret: "...",
callbackURL: "...",
profileFields: ['id', 'displayName', 'name', 'gender', ..., 'photos']
您可以做的只是抓取给定属性的值。假设您要创建一个保存此值的属性:
picture: profile.photos ? profile.photos[0].value : '/img/faces/unknown-user-pic.jpg'
这被证明是更好的解决方案,因为某些用户或有时用户名的值可能未定义。
我希望你也觉得这很有用,
谢谢。
答案 2 :(得分:8)
是的,可以使用这样的访问令牌通过图形api访问图片。 " graph.facebook.com /&#34 ;; + profile.username +" / picture" +"?width = 200& height = 200" +"& access_token =" + accessToken;无需使用配置文件字段。
答案 3 :(得分:0)
使用此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}`
//
}))
答案 4 :(得分:0)
2020 解决方案
使用户从passportjs.password-facebook策略获取accessToken。
使用此令牌获取带有用户头像的url的json:
https://graph.facebook.com/me/picture?access_token=${accessToken}&&redirect=false