web-dev-qa-db-fra.com

L'authentification Passport-Facebook ne fournit pas de courrier électronique

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: ['', '']

41
AMT

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:

  • carte d'indentité
  • profil.nom.givenName
  • nom_profil.nom_famille
  • profile.emails

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.

94
Forivin

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

25
sifxtreme

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.

  • Aucune adresse e-mail sur le compte
  • Aucune adresse e-mail confirmée sur le compte
  • Aucune adresse e-mail vérifiée sur le compte
  • L'utilisateur a entré un point de contrôle de sécurité qui lui a demandé de reconfirmer son adresse e-mail .__ et il ne l'a pas encore fait
  • L'adresse e-mail de l'utilisateur est inaccessible

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/

7
vinesh

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/

1

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 .

0
marcelocra