我正在使用Passport-Facebook身份验证。
passport.use(new FacebookStrategy({ clientID: 'CLIENT_ID', clientSecret: 'CLIENT_SECRET', callbackURL: "http://www.example.com/auth/facebook/callback" }, function (accessToken, refreshToken, profile, done) { process.nextTick(function () { console.log(profile) }); } ));
对于某些Facebook帐户,我没有收到email_id,我甚至尝试使用下面的范围变量,但我仍然无法获取email_id。
profileUrl:“”和ProfileFields:['','']
答案 0 :(得分:98)
确保代码中包含以下两项内容:
passport.use(new FacebookStrategy({
clientID: 'CLIENT_ID',
clientSecret: 'CLIENT_SECRET',
callbackURL: "http://www.example.com/auth/facebook/callback"
passReqToCallback : true,
profileFields: ['id', 'emails', 'name'] //This
},
和此:
app.get('/connect/facebook', passport.authorize('facebook', { scope : ['email'] }));
这使您可以访问以下内容:
最后一个是数组,因此请使用profile.emails[0].value
获取用户的第一个电子邮件地址。
正如shamim reza
指出的那样,您可能需要检查profile.emails !== undefined
是否属性,因为如果用户至少有一个经过验证的电子邮件地址,则该属性才存在。
答案 1 :(得分:25)
当您进行身份验证时,请使用与此类似的内容。在进行身份验证时,您需要在范围中添加“email”。
app.get('/auth/facebook',
passport.authenticate('facebook', { scope: ['email']}),
function(req, res){
});
这对我有用。
以下是一些帮助我的链接。
https://github.com/jaredhanson/passport-facebook/issues/11 https://github.com/jaredhanson/passport-facebook#how-do-i-ask-a-user-for-additional-permissions
答案 2 :(得分:7)
我想在此处添加更多信息。
在创建FacebookStrategy时添加profileFields: ['emails']
,passport.authorize('facebook', { scope : ['email'] })
解决了大多数用户的问题。
还有其他可能的原因导致您无法在身份验证后收到用户的电子邮件。
您需要确保您的用户没有上面列出的任何问题。可以找到更多信息https://developers.facebook.com/bugs/1802930019968631/
答案 3 :(得分:1)
当护照没有返回 '2018-10-28 12:49:00'
字段时,或者如果缺少它们,您可以尝试解析profile.emails, profile.name.givenName, profile.name.familyName
网址,尽管您仍然需要令牌。您访问的URL当然带有有效的令牌,例如:
https://graph.facebook.com/v3.2/me?fields=id,name,email,first_name,last_name&access_token=
它输出JSON响应,如:
https://graph.facebook.com/v3.2/
安装请求模块({
"id": "5623154876271033",
"name": "Kurt Van den Branden",
"email": "kurt.vdb\u0040example.com",
"first_name": "Kurt",
"last_name": "Van den Branden"
}
),以便能够解析JSON URL并在password.js文件中:
$ npm install request --save
您可以向URL添加很多其他参数,尽管其中一些参数需要用户许可才能返回值。您可以在https://developers.facebook.com/tools/explorer/
上玩它答案 4 :(得分:0)
您可以使用code provided as an example in the passport-facebook
site作为起点。然后,要访问电子邮件,请务必选中@Forivin's answer。
答案 5 :(得分:0)
确保在第一个.authenticate()调用中提供了范围参数,而不是回调中。
赞:
router.get("/auth/facebook", passport.authenticate("facebook", {
scope: [ "email" ], // scope goes here, not below
}));
router.get("/auth/facebook/callback",
passport.authenticate("facebook", {
successRedirect: "/",
failureRedirect: "/login",
}),
);
答案 6 :(得分:-1)
passport.use(new FacebookStrategy({
clientID: 'CLIENT_ID',
clientSecret: 'CLIENT_SECRET',
callbackURL: "http://www.example.com/auth/facebook/callback"
},
function (accessToken, refreshToken, profile, done) {
process.nextTick(function () {
console.log(profile)
});
}
));