gpt4 book ai didi

facebook - 在 Node 中使用 passportJS 访问 Facebook 生日、家乡等数据

转载 作者:行者123 更新时间:2023-12-04 02:50:33 27 4
gpt4 key购买 nike

我正在尝试将 OAuth2 登录添加到我基于 Node/ExpressJS/MongoDB/PassportJS 构建的应用中。

我用这个方法可以成功登录,但是我无法获取某些信息。我唯一能够访问的是 emailnamefbId 字段 - 我目前无法访问生日、喜欢、家乡和其他来自 here 的信息.

我的 userSchema 是这样设置的:

var userSchema = new mongoose.Schema({
fbId: String,
name: String,
email: { type:String, lowercase: true },
gender: String,
birthday: String,
hometown: Object,
location: Object,
likes: Array
});

这是在我的 Express 服务器上运行的代码:

passport.use(new FacebookStrategy({
clientID: config.development.fb.appId,
clientSecret: config.development.fb.appSecret,
callbackURL: config.development.fb.url + 'fbauthed'
},
function(accessToken, refreshToken, profile, done) {
process.nextTick(function() {
var query = User.findOne({ 'fbId': profile.id });
query.exec(function(err, oldUser) {
if (oldUser) {
console.log('Existing user: ' + oldUser.name + ' found and logged in!');
done(null, oldUser);
} else {
var newUser = new User();
newUser.fbId = profile.id;
newUser.name = profile.displayName;
newUser.email = profile.emails[0].value;
newUser.gender = profile.gender;
newUser.birthday = profile.birthday;
newUser.hometown = profile.hometown;
newUser.location = profile.location;
newUser.likes = profile.likes;

newUser.save(function(err) {
if (err) { return done(err); }
console.log('New user: ' + newUser.name + ' created and logged in!');
done(null, newUser);
});
}
});
});
}
));
app.get('/fbauth', passport.authenticate('facebook', { scope: 'email' }));
app.get('/fbauthed', passport.authenticate('facebook',{ failureRedirect: '/' }), function(req, res){}

当我尝试登录并尝试访问这些属性时,我得到:

fbId: String, // Defined
name: String, // Defined
email: { type:String, lowercase: true }, // Defined
gender: String, // Defined
birthday: String, // UNDEFINED
hometown: Object, // UNDEFINED
location: Object, // UNDEFINED
likes: Array // UNDEFINED

我是否试图错误地访问它们?我在这里做错了什么?

最佳答案

我找到了解决方案。这是我最初给 facebook 的电话,在这里:

app.get('/fbauth', passport.authenticate('facebook', { scope: 'email' }));

scope 部分是您从用户那里获得身份验证的内容。如果你看at the documentation您会看到“生日”需要 user_birthday,“喜欢”需要 user_likes。所以这是我必须做的:

app.get('/fbauth', passport.authenticate('facebook', { scope: ['email', 'user_birthday', 'user_likes'] }));

然后我从我的 Facebook 帐户中取消了应用程序的身份验证,从我的数据库中删除了我的用户配置文件,注销并重新启动身份验证,它工作得很好。上面关于执行 console.log(profile) 的建议很好,因为它可以帮助您了解 Facebook 实际发回的数据。

关于facebook - 在 Node 中使用 passportJS 访问 Facebook 生日、家乡等数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17870818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com