我在登录用户时试图从Facebook获取的一些个人资料字段未经过。
我在节点中使用passportjs。这是Facebook的策略:
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'没有被其他字段拉过来。
答案 0 :(得分:6)
profileFields参数符合Portable Contacts convention。这意味着你想要使用电子邮件'而不是'电子邮件'。至于" about_me"字段,看起来好像passport-facebook完全支持OpenSocial协议。如果你想使用" profileFields"这意味着你运气不好。这两个配置文件元素的参数。以下代码片段取自主分支,说明了此限制:
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参数,那么奇怪的是,您将收到" about_me"您感兴趣的内容,名为" bio"。以下是您可以访问的方式:
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);
}));
不幸的是,这并没有为您提供您感兴趣的其他数据。我猜测在您的情况下,您可能正在考虑在passport-facebook回调期间收集支持的约定字段,然后抓住直接使用facebook api在后续通话中扩展个人资料字段。无论是那个还是戳护照-facebook维护者来扩展他们的现场支持。
答案 1 :(得分:1)
aturkelson是对的。 about_me尚不支持。只要您提出要求,就电子邮件而言,它会附带个人资料。我还有一个控制台日志,以确认我并不疯狂。
//Passport facebook strategy
exports.passportInit= passport.use(new facebookStrategy({
clientID: process.env.FACEBOOK_APP_ID ,
clientSecret: process.env.FACEBOOK_SECRET_ID,
callbackURL: '/api/auth/facebook/callback',
profileFields: ['id', 'displayName', 'emails', 'photos']
},
function(accessToken, refreshToken, profile, done) {
console.log(profile);
db.User.findOne({facebook_id: profile.id}, function(err, oldUser){
if(oldUser){
done(null,oldUser);
}else{
var newUser = new db.User({
facebook_id : profile.id,
facebook_photo : profile.photos[0].value,
email : profile.emails[0].value,
display_name : profile.displayName,
// picture: profile.picture
}).save(function(err,newUser){
if(err) throw err;
done(null, newUser);
});
}
});
}
));
答案 2 :(得分:0)
根据我的知识,FB正在为您提供信息...... 试试这段代码..
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: FACEBOOK_CALLBACK_URL,
profileFields: ['id', 'displayName', 'email'] },
function(accessToken, refreshToken, profile, done) {
// asynchronous
process.nextTick(function() {
FACEBOOK_TOKEN = accessToken;
FACEBOOK_USER = profile._json;
// facebook can return multiple emails so we'll take the first
profile.emails[0].value;
console.log(FACEBOOK_USER.email);
done(null, profile);
});
}));