无法从 Facebook 护照获取电子邮件信息
Can't get email information from Facebook passport
目前我正在做一个项目来存储来自 Facebook 身份验证的信息,我已经检查了 Passport-facebook doesn't get email 以查看解决方案,这是我的代码
passport.use(new FacebookStrategy(
{
clientID: 'xxxxxxxxxxxxx',
clientSecret: 'xxxxxxxxxxxxxxxx',
callbackURL: 'http://1bc600b4.ngrok.io/auth/facebook/callback',
profileFields: ['id', 'displayName', 'name', 'photos', 'email'],
},
(accessToken, refreshToken, profile, done) => {
console.log(profile);
models.User.findOne({ where: { facebookID: profile.id } }).then((existinguser) => {
if (existinguser) {
// Nothing will happen, the ID already exists
done(null, existinguser);
} else {
models.User.create({
// email: profile.emails[0].value,
username: 'hello',
firstname: profile.name.givenName,
lastname: profile.name.familyName,
facebookID: profile.id,
avatar: `https://graph.facebook.com/${profile.id}/picture?redirect=true&height=470&width=470`,
avatarThumb: profile.photos[0].value,
last_login: Date.now(), }).then(user => done(null, user));
}
});
},
));
app.use(passport.initialize());
app.get('/flogin', passport.authenticate(
'facebook',
passport.authenticate('facebook', { scope: ['profile', 'email'] }),
));
app.get(
'/auth/facebook/callback',
passport.authenticate('facebook', { session: false }),
(req, res) => {
res.send('AUTH WAS GOOD!');
},
);
我不明白为什么我用这种方式仍然没有显示电子邮件信息,这让我失去了很多信息,谁能给我解决这个问题的提示?谢谢!
这个问题已经存在一段时间了,你需要包括电子邮件范围,即使这样它也可能不会发送 facebook 电子邮件,因为用户隐私设置或者如果用户的电子邮件在 facebook 端没有验证。
您可以像这样添加范围:
passport.use(
new FacebookStrategy({
clientID: 'CLIENT_ID',
clientSecret: 'CLIENT_SECRET',
callbackURL: "http://www.example.com/auth/facebook/callback"
passReqToCallback : true,
profileFields: ['emails'] // email should be in the scope.
})
)
此外,您还需要将此添加到您的授权路由中,
app.get('/login/facebook', passport.authorize('facebook', { scope : ['email'] }));
如果电子邮件 return,这将是一个列表,您可以这样访问它们:
1. profile.emails // [email1@example.com, somerandomdude@gmail.com]
2. profile.emails[1].value // randomdude@yahoo.com
如果没有 return,您可以使用他们的用户名或 ID 至少临时创建一个 Facebook 电子邮件,如下所示:
username@facebook.com // this exists.
目前我正在做一个项目来存储来自 Facebook 身份验证的信息,我已经检查了 Passport-facebook doesn't get email 以查看解决方案,这是我的代码
passport.use(new FacebookStrategy(
{
clientID: 'xxxxxxxxxxxxx',
clientSecret: 'xxxxxxxxxxxxxxxx',
callbackURL: 'http://1bc600b4.ngrok.io/auth/facebook/callback',
profileFields: ['id', 'displayName', 'name', 'photos', 'email'],
},
(accessToken, refreshToken, profile, done) => {
console.log(profile);
models.User.findOne({ where: { facebookID: profile.id } }).then((existinguser) => {
if (existinguser) {
// Nothing will happen, the ID already exists
done(null, existinguser);
} else {
models.User.create({
// email: profile.emails[0].value,
username: 'hello',
firstname: profile.name.givenName,
lastname: profile.name.familyName,
facebookID: profile.id,
avatar: `https://graph.facebook.com/${profile.id}/picture?redirect=true&height=470&width=470`,
avatarThumb: profile.photos[0].value,
last_login: Date.now(), }).then(user => done(null, user));
}
});
},
));
app.use(passport.initialize());
app.get('/flogin', passport.authenticate(
'facebook',
passport.authenticate('facebook', { scope: ['profile', 'email'] }),
));
app.get(
'/auth/facebook/callback',
passport.authenticate('facebook', { session: false }),
(req, res) => {
res.send('AUTH WAS GOOD!');
},
);
我不明白为什么我用这种方式仍然没有显示电子邮件信息,这让我失去了很多信息,谁能给我解决这个问题的提示?谢谢!
这个问题已经存在一段时间了,你需要包括电子邮件范围,即使这样它也可能不会发送 facebook 电子邮件,因为用户隐私设置或者如果用户的电子邮件在 facebook 端没有验证。
您可以像这样添加范围:
passport.use(
new FacebookStrategy({
clientID: 'CLIENT_ID',
clientSecret: 'CLIENT_SECRET',
callbackURL: "http://www.example.com/auth/facebook/callback"
passReqToCallback : true,
profileFields: ['emails'] // email should be in the scope.
})
)
此外,您还需要将此添加到您的授权路由中,
app.get('/login/facebook', passport.authorize('facebook', { scope : ['email'] }));
如果电子邮件 return,这将是一个列表,您可以这样访问它们:
1. profile.emails // [email1@example.com, somerandomdude@gmail.com]
2. profile.emails[1].value // randomdude@yahoo.com
如果没有 return,您可以使用他们的用户名或 ID 至少临时创建一个 Facebook 电子邮件,如下所示:
username@facebook.com // this exists.