webentwicklung-frage-antwort-db.com.de

Die Passport-Facebook-Authentifizierung stellt keine E-Mail-Adresse für alle Facebook-Konten bereit

Ich benutze Passport-Facebook Authentifizierung.

 passport.use (neue 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) 
}); 
} 
 )); 

Für einige der Facebook-Konten bekomme ich nicht die email_id und habe es sogar versucht, eine Bereichsvariable wie unten zu verwenden, aber ich kann die email_id immer noch nicht abrufen. 

profileUrl: "" und ProfileFields: ['', '']

41
AMT

Stellen Sie sicher, dass diese beiden Dinge in Ihrem Code enthalten sind:

  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
        },

und das:

app.get('/connect/facebook', passport.authorize('facebook', { scope : ['email'] }));

Dadurch haben Sie Zugriff auf Folgendes:

  • profil ID
  • profile.name.givenName
  • profile.name.familyName
  • profil.emails

Das letzte Array ist ein Array. Verwenden Sie profile.emails[0].value, um die erste E-Mail-Adresse des Benutzers zu erhalten.

Wie shamim reza hervorgehoben hat, möchten Sie möglicherweise prüfen, ob profile.emails !== undefined vorhanden ist, da die Eigenschaft nur vorhanden ist, wenn der Benutzer mindestens eine verifizierte E-Mail-Adresse besitzt.

94
Forivin

Wenn Sie sich authentifizieren, verwenden Sie etwas Ähnliches. Sie müssen bei der Authentifizierung im Bereich "E-Mail hinzufügen" verwenden.

app.get('/auth/facebook',
passport.authenticate('facebook', { scope: ['email']}),
    function(req, res){
});

Das hat bei mir funktioniert.

Hier waren ein paar Links, die mir geholfen haben.

https://github.com/jaredhanson/passport-facebook/issues/11https://github.com/jaredhanson/passport-facebook#how-do-i-ask-a- Benutzer für zusätzliche Berechtigungen

25
sifxtreme

Ich möchte hier weitere Informationen hinzufügen.

Beim Hinzufügen von profileFields: ['emails'] beim Erstellen von FacebookStrategy und passport.authorize('facebook', { scope : ['email'] }) wird das Problem für die meisten Benutzer gelöst. 

Es gibt andere mögliche Gründe, aus denen Sie nach der Authentifizierung keine E-Mail erhalten.

  • Keine E-Mail-Adresse auf Rechnung
  • Keine bestätigte E-Mail-Adresse auf Rechnung
  • Keine bestätigte E-Mail-Adresse auf Konto
  • Der Benutzer hat einen Sicherheitskontrollpunkt eingegeben, der die erneute Bestätigung der E-Mail-Adresse von Erforderlich machte
  • Die E-Mail-Adresse des Benutzers ist nicht erreichbar

Sie müssen sicherstellen, dass Ihr Benutzer keine der oben aufgeführten Probleme hat. Weitere Informationen finden Sie unter https://developers.facebook.com/bugs/1802930019968631/ .

7
vinesh

Wenn der Pass die profile.emails, profile.name.givenName, profile.name.familyName-Felder nicht zurückgibt oder wenn sie fehlen, können Sie versuchen, die https://graph.facebook.com/v3.2/-URL zu analysieren, obwohl Sie immer noch ein Token benötigen. Sie greifen auf die URL zu, natürlich mit einem gültigen Token wie:

https://graph.facebook.com/v3.2/me?fields=id,name,email,first_name,lasten_name&access_token=

Es gibt eine JSON-Antwort wie folgt aus:

{
   "id": "5623154876271033",
   "name": "Kurt Van den Branden",
   "email": "kurt.vdb\u0040example.com",
   "first_name": "Kurt",
   "last_name": "Van den Branden"
}

Installieren Sie das Anforderungsmodul ($ npm install request --save), um eine JSON-URL und in Ihrer Datei passport.js analysieren zu können:

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); 
        });
    }
));

Sie können der URL viele andere Parameter hinzufügen, obwohl einige für die Rückgabe von Werten eine Benutzerberechtigung erfordern. Sie können damit spielen auf: https://developers.facebook.com/tools/Explorer/

Stellen Sie sicher, dass Sie den scope-Parameter im ersten Aufruf von .authenticate () und nicht im Rückruf angeben.

So was:

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",
    }),
);
0
Lacho Tomov

Sie können den code verwenden, der als Beispiel in der passport-facebook-Site angegeben ist. Um Zugriff auf die E-Mail zu erhalten, überprüfen Sie bitte die Antwort von @ Forivin .

0
marcelocra