Node.js 使用passport Facebook从Facebook检索照片

Node.js 使用passport Facebook从Facebook检索照片,node.js,express,passport.js,passport-facebook,Node.js,Express,Passport.js,Passport Facebook,我能够通过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/c

我能够通过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);
}));};
但是,我无法在“个人资料”中看到个人资料图片

文档中说,要检索照片,我们需要传递profileFields,如下所示。但这样做,我可以看到照片URL,但丢失了_json中包含的其他数据,例如profile._json.location.name。如何在其他用户信息完整的情况下检索照片

passport.use(new FacebookStrategy({
// clientID, clientSecret and callbackURL
profileFields: ['id', 'displayName', 'photos', ....]},// verify callback));

是的,可以通过graph api使用如下访问令牌访问图片。“graph.facebook.com/”;+profile.username+“/picture”+“?宽度=200,高度=200”+”&access_-token=“+accessToken;不需要使用配置文件字段。

除了回答您的问题之外,您不必这样做。正如您所提到的,您可以为Facebook个人资料定义所需的属性:

  clientID: "...",
  clientSecret: "...",
  callbackURL: "...",
  profileFields: ['id', 'displayName', 'name', 'gender', ..., 'photos']
您所能做的只是简单地获取给定属性的值。假设您希望创建一个包含此值的属性:

picture: profile.photos ? profile.photos[0].value : '/img/faces/unknown-user-pic.jpg'
这被证明是一个更好的解决方案,因为有些用户或有时用户名的值可能未定义

我希望你也觉得这很有用


谢谢。

如果您需要更大的图像(上面miksii示例中的默认值为50px 50px,非常小),请使用:

profileFields: ['id', 'displayName', 'name', 'gender', 'picture.type(large)']
然后

picture: profile.photos ? profile.photos[0].value : '/img/faces/unknown-user-pic.jpg'
这将返回该用户的200px 200px配置文件图片

因此,使用此代码将更好地工作

passport.use(新facebook策略)({
客户ID:FACEBOOK\u应用程序\u ID,
clientSecret:FACEBOOK\u APP\u SECRET,
callbackURL:FACEBOOK\u APP\u CALLBACK,
profileFields:['id'、'displayName'、'picture.type(大)'、'email'、'birth'、'friends'、'first_name'、'last_name'、'middle_name'、'gender'、'link']
},(accessToken、refreshToken、配置文件、cb)=>{
常量图片=`https://graph.facebook.com/${profile.id}/picture?宽度=200,高度=200,访问令牌=${accessToken}`
//
}))

2020解决方案

从passportjs passport facebook策略获取用户accessToken
使用此令牌获取json和用户化身的url:

https://graph.facebook.com/me/picture?access_token=${accessToken}&&redirect=false

你有没有想过这一点?是的,图片可以通过graph api使用如下访问令牌访问。“+profile.username+”/picture“+”?宽度=200,高度=200“+”&access_-token=“+accessToken;没有必要使用配置文件字段。我知道这已经有一年多的历史了,但是你能解释一下为什么要使用这个结构吗?和:而不是仅仅设置一个值?试图理解发生了什么,谢谢:)这是缩短if-else条件结构在哪里?表示“case profile.photos返回true”和:表示“case profile.photos返回false”。关于这一点,如果没有照片,我们希望为我们的用户设置默认图片(这张图片位于指定的路径img/faces/unknown..jpg中)!谢谢:DBTW,您不能同时使用“picture.type(大)”和“photos”