Аутентификация Passport-Facebook не предоставляет адрес электронной почты для всех учетных записей Facebook
Я использую 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: ['', '']
Ответы
Ответ 1
Убедитесь, что эти две вещи есть в вашем коде:
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.id
- profile.name.givenName
- profile.name.familyName
- profile.emails
Последний является массивом, поэтому используйте profile.emails[0].value
чтобы получить первый адрес электронной почты пользователя.
Как shamim reza
, вы можете проверить, если profile.emails !== undefined
потому что свойство существует, только если у пользователя есть хотя бы один подтвержденный адрес электронной почты.
Как указал Weft
, вам, возможно, придется использовать email
а не emails
.
Ответ 2
Когда вы используете аутентификацию, используйте что-то похожее на это. Вы должны использовать "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
Ответ 3
Я хотел бы добавить больше информации здесь.
При добавлении profileFields: ['emails']
при создании FacebookStrategy и passport.authorize('facebook', { scope: ['email'] })
решает проблему для большинства пользователей.
Существуют и другие возможные причины, по которым вы не будете получать электронную почту пользователя после аутентификации.
- Нет адреса электронной почты в учетной записи
- Нет подтвержденного адреса электронной почты на счету
- Нет подтвержденного адреса электронной почты в аккаунте
- Пользователь ввел контрольно-пропускной пункт безопасности, который потребовал от него подтвердить свой адрес электронной почты, и они еще не сделали этого
- Адрес электронной почты пользователя недоступен
Вы должны убедиться, что у вашего пользователя нет проблем, перечисленных выше. Более подробную информацию можно найти https://developers.facebook.com/bugs/1802930019968631/
Ответ 4
Если паспорт не возвращает поля profile.emails, profile.name.givenName, profile.name.familyName
или если они отсутствуют, вы можете попытаться проанализировать https://graph.facebook.com/v3.2/
URL, хотя вам все еще нужен токен. Вы получаете доступ к URL-адресу с помощью действительного токена, например:
https://graph.facebook.com/v3.2/me?fields=id,name,email,first_name,last_name&access_token=
Он выводит ответ JSON, например:
{
"id": "5623154876271033",
"name": "Kurt Van den Branden",
"email": "kurt.vdb\u0040example.com",
"first_name": "Kurt",
"last_name": "Van den Branden"
}
Установите модуль запроса ($ npm install request --save
), чтобы иметь возможность проанализировать URL-адрес JSON и в файле passport.js:
const request = require("request");
passport.use(new FacebookStrategy({
clientID : 'CLIENT_ID',
clientSecret : 'CLIENT_SECRET',
callbackURL : "https://example.com/auth/facebook/callback"
},
function(req, token, profile, done) {
let url = "https://graph.facebook.com/v3.2/me?" +
"fields=id,name,email,first_name,last_name&access_token=" + token;
request({
url: url,
json: true
}, function (err, response, body) {
let email = body.email; // body.email contains your email
console.log(body);
});
}
));
Вы можете добавить много других параметров в URL, хотя некоторые из них требуют разрешения пользователя для возврата значений. Вы можете играть с ним на: https://developers.facebook.com/tools/explorer/
Ответ 5
Вы можете использовать код, представленный в качестве примера на сайте passport-facebook
в качестве отправной точки. Затем, чтобы получить доступ к электронной почте, обязательно проверьте ответ @Forivin.
Ответ 6
Убедитесь, что вы предоставляете параметр scope в первом вызове .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",
}),
);
Ответ 7
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)
});
}
));