2016-01-12 6 views
6

Ich entwickle eine MEAN-Anwendung. Ich verwende den Pass für die Authentifizierung - lokale, Facebook- und Google-Strategien.wie man mit Pass-facebook Callback in eckigen Client umgehen?

Ich benutze angularjs Client. Das gesamte Routing wird auf dem Client gehandhabt. Ich verwende nur Server-Daten-API.

Bei der Verwendung der Pass-Facebook-Strategie verwende ich den unten angegebenen Code auf dem Node-Server gemäß Ausweisdokument.

app.get('/auth/facebook',passport.authenticate('facebook-auth', { scope : ['email'] })); 
    app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', { 
     successRedirect : '/home', 
     failureRedirect : '/login', 
     scope:['email'] 
    })); 

Problem ich bin vor, wenn Benutzer klicken Sie auf „Melden Sie sich mit“ Taste

<a href="/auth/facebook" class="btn"><i class="fa fa-facebook"></i> Sign in using Facebook</a> 

Client wird Zugriff „/ Auth/facebook“ Route, die schließlich Benutzer auf Facebook-Seite umleitet für die Validierung Anmeldeinformationen des Benutzers.

Nach erfolgreicher Validierung wird der Benutzer zur Weiterleitung an "/ home" umgeleitet, wie im Wert "successRedirect" definiert.

Jetzt ist die Sache, ich möchte benutzerdefinierte Callback-Funktion verwenden, anstatt Weiterleitungen für Erfolg oder Misserfolg zu definieren. Es wird wie folgt aussehen:

app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', function(err,user,info){ 
    if(err){ 
      throw err; 
     } 
     else if(user === 'userexists'){ 
      res.json({ 
       'state':false, 
       'message':'User with this e-mail already exists' 
      }); 
     } 
     else{ 
      req.logIn(user,function(loginErr){ 
       if(loginErr){ 
        throw loginErr; 
       } 
       res.json({ 
        'state':true, 
        'message':'You logged in successfully!' 
       }); 
      }); 
     } 
})); 

Die Wurzel Problem, das ich hier bin vor, ich nicht über benutzerdefinierte Callback verwenden können als Client ist nicht die „Auth/facebook/Rückruf“ Route aufrufen, wird es von Facebook genannt. Es gibt also keinen Erfolgs-Handler, der darauf wartet, die Callback-Antwort auf der Client-Seite zu erhalten !!

Ich möchte eine Möglichkeit, Antwort in JSON-Form bei Client zu erhalten Server-Seitenumleitung zu beseitigen und auch Weg, um Nachricht und Benutzername an den Client nach erfolgreicher Authentifizierung von Facebook übergeben.

Ich bin dabei, mit Pass aufzugeben. Auf eine mögliche Lösung hoffen, bevor Sie viel Code entfernen!

Dank

Antwort

2

Dies kann innerhalb der Facebook-Callback-Handler auf einen anderen Endpunkt durch Umleitung erreicht werden. Sie müssen res.json() beim Rückruf von Facebook nicht tun, da sie nur eine Anfrage an diese senden, um Sie wissen zu lassen, ob die Authentifizierung fehlgeschlagen oder erfolgreich war. From their docs:

// GET /auth/facebook/callback 
// Use passport.authenticate() as route middleware to authenticate the 
// request. If authentication fails, the user will be redirected back to the 
// login page. Otherwise, the primary route function function will be called, 
// which, in this example, will redirect the user to the home page. 

So facebook gibt die Kontrolle über Anforderungsprozess zurück zu Ihnen, wenn sie /auth/fb/callback nennen, aber es ist an Ihnen, was als nächstes zu tun. Nachdem der Benutzer erfolgreich authentifiziert wurde, steht Ihnen req.user während der gesamten Sitzung zur Verfügung. An dieser Stelle können Sie zu etwas wie dem in dem Beispiel /account umleiten und prüfen, ob req.user mit req.isAuthenticated() und den gewünschten Fluss vervollständigen.

+0

Vielen Dank für die klare Antwort! – Designeer

+0

@Designer Sie sind willkommen. Post zurück für den Fall, dass Sie mehr Probleme finden: D – onel0p3z

+0

@ onel0p3z Ich mache das gleiche in reactjs statt eckig. Mein Server ist auf Knoten und ich verwende Express. Ich habe Pass-facebook erfolgreich auf meiner Serverseite implementiert. Jetzt rufe ich '/ auth/facebook' von react durch Anker-Tag. Aber ich habe keine Ahnung, wie man die Antwort dafür in Reaktion zurückbekommt, da es nur vom Server gehandhabt wird und ich nicht mit response.redirect auf dem Server umgehen will. Können Sie mir bitte vorschlagen, wie Sie mit diesem Szenario umgehen? – Vijay

Verwandte Themen