我正在尝试将OAuth2登录添加到我在Node / ExpressJS / MongoDB / PassportJS上构建的应用程序。
我可以使用此方法成功登录,但我无法获得某些信息。我能够访问的唯一内容是email
,name
和fbId
字段 - 我目前无法访问来自here的生日,喜欢,家乡和其他信息。< / p>
我的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
我是否尝试错误地访问它们?我在这里做错了什么?
答案 0 :(得分:3)
我找到了解决方案。这是我原来打电话给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实际发回的数据。
答案 1 :(得分:1)
JSON配置文件包含大量可以访问的数据。特别是家乡可以通过
访问newuser.hometown= profile._json.hometown.name;
我建议理解
的结构profile
你添加
console.log(profile);
in
process.nextTick(function() {
console.log(profile);
}
在给出newuser.xxx = profile.xxx的命令之前;这将在您的控制台上打印配置文件的结构,然后您可以阅读该配置文件以了解如何访问相关字段。