Проверка подлинности Passport-Facebook не обеспечивает электронную почту для всех учетных записей Facebook
Я использую аутентификацию Passport-Facebook.
passport.use (новая FacebookStrategy({ clientID: 'CLIENT_ID', clientSecret: 'CLIENT_SECRET', callbackURL: "http://www.example.com/auth/facebook/callback" }, функция (accessToken, refreshToken, профиль, готово) { process.nextTick(function () { console.log(профиль) }); }));
Для некоторых учетных записей Facebook я не получаю email_id, и я даже пытался использовать переменную области видимости, такую как ниже, но я все еще не могу получить email_id.
profileUrl: "" и ProfileFields: ['','']
6 ответов
Убедитесь, что эти две вещи есть в вашем коде:
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
потому что свойство существует, только если у пользователя есть хотя бы один подтвержденный адрес электронной почты.
Когда вы проходите аутентификацию, используйте что-то похожее на это. Вы должны использовать добавить "адрес электронной почты" в области при аутентификации.
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
Я хотел бы добавить больше информации здесь.
При добавлении profileFields: ['emails']
при создании FacebookStrategy и passport.authorize('facebook', { scope : ['email'] })
решает проблему для большинства пользователей.
Существуют и другие возможные причины, по которым вы не получите электронную почту пользователя после аутентификации.
- Нет адреса электронной почты на счету
- Нет подтвержденного адреса электронной почты на счету
- Нет подтвержденного адреса электронной почты в аккаунте
- Пользователь ввел контрольно-пропускной пункт безопасности, который потребовал от него подтвердить свой адрес электронной почты, и они еще не сделали этого
- Адрес электронной почты пользователя недоступен
Вы должны убедиться, что у вашего пользователя нет проблем, перечисленных выше. Более подробную информацию можно найти https://developers.facebook.com/bugs/1802930019968631/
Когда паспорт не возвращается 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/
Убедитесь, что вы указываете параметр области в первом вызове.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",
}),
);
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)
});
}
));
Вы можете использовать код, приведенный в качестве примера в passport-facebook
сайт как отправная точка. Затем, чтобы получить доступ к электронной почте, обязательно проверьте ответ @Forivin.