J'utilise Passport-Facebook authentication.
passport.use (nouvelle FacebookStrategy ({ clientID: 'ID_CLIENT', clientSecret: 'CLIENT_SECRET', callbackURL: "http://www.example.com/auth/facebook/callback" }, function (accessToken, refreshToken, profile, done) { process.nextTick (function () { console.log (profile) }); } ));
Pour certains comptes Facebook, je ne reçois pas l'email_id et j'ai même essayé d'utiliser une variable d'étendue telle que celle-ci, mais je ne parviens toujours pas à obtenir l'email_id.
profileUrl: "" et ProfileFields: ['', '']
Assurez-vous que ces deux choses sont dans votre code:
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
},
et ça:
app.get('/connect/facebook', passport.authorize('facebook', { scope : ['email'] }));
Cela vous donne accès aux éléments suivants:
Le dernier étant un tableau, utilisez donc profile.emails[0].value
pour obtenir la première adresse électronique de l'utilisateur.
Comme l'a souligné shamim reza
, vous souhaiterez peut-être vérifier si profile.emails !== undefined
car la propriété n'existe que si l'utilisateur a au moins une adresse électronique vérifiée.
Lorsque vous vous authentifiez, utilisez quelque chose de similaire. Vous devez utiliser add 'email' dans la portée lors de l'authentification.
app.get('/auth/facebook',
passport.authenticate('facebook', { scope: ['email']}),
function(req, res){
});
Cela a fonctionné pour moi.
Voici quelques liens qui m'ont aidé.
https://github.com/jaredhanson/passport-facebook/issues/11https://github.com/jaredhanson/passport-facebook#how-do-i-aska- user-for-additional-permissions
Je voudrais ajouter plus d'informations ici.
L'ajout de profileFields: ['emails']
lors de la création de FacebookStrategy et de passport.authorize('facebook', { scope : ['email'] })
résout le problème rencontré par la plupart des utilisateurs.
Il existe d'autres raisons possibles pour lesquelles vous ne recevrez pas le courrier électronique de l'utilisateur après l'authentification.
Vous devez vous assurer que votre utilisateur n’a aucun des problèmes énumérés ci-dessus. plus d'informations peuvent être trouvées https://developers.facebook.com/bugs/1802930019968631/
Si le passeport ne renvoie pas les champs profile.emails, profile.name.givenName, profile.name.familyName
, ou s’ils sont manquants, vous pouvez essayer d’analyser l’URL https://graph.facebook.com/v3.2/
, même si vous avez toujours besoin d’un jeton. Vous accédez à l'URL, avec bien sûr un jeton valide, comme:
https://graph.facebook.com/v3.2/me?fields=id,name,email,first_name,last_name&access_token=
Il génère une réponse JSON telle que:
{
"id": "5623154876271033",
"name": "Kurt Van den Branden",
"email": "kurt.vdb\u0040example.com",
"first_name": "Kurt",
"last_name": "Van den Branden"
}
Installez le module de requête ($ npm install request --save
) pour pouvoir analyser une URL JSON et dans votre fichier 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);
});
}
));
Vous pouvez ajouter de nombreux autres paramètres à l'URL, bien que certains d'entre eux nécessitent l'autorisation de l'utilisateur pour renvoyer des valeurs. Vous pouvez y jouer avec: https://developers.facebook.com/tools/Explorer/
Vous pouvez utiliser le code fourni à titre d'exemple dans le site passport-facebook
comme point de départ. Ensuite, pour avoir accès au courrier électronique, assurez-vous de vérifier @ réponse de Forivin .