Node.js 使用passport Facebook从Facebook检索照片
我能够通过passport facebook检索基本用户信息,遵循以下代码并保存在mongodb中: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
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”