2016-06-21 15 views
4

Ich versuche, eine Webanwendung in Node.js schreiben, die passport-facebook Authentifizierung Strategie verwendet. Standardmäßig funktioniert der im Beispiel angegebene Mechanismus, indem der Benutzer auf Facebook API umgeleitet wird, wo der Benutzer seinen Benutzernamen und sein Passwort eingeben kann. Sobald Facebook den Benutzer verifiziert hat, wird das Token an eine Rückruf-URL in meiner Anwendung zurückgegeben.So übergeben Sie zusätzliche Daten in Pass-facebook Authentifizierung

Jetzt funktionieren diese Dinge für meine Anwendung. Ich kann mich ohne Probleme mit Facebook einloggen. Aber ich möchte ein zusätzliches Feld an den Server übergeben, wenn ich versuche, mich anzumelden.

Grundsätzlich ist mein Plan, eine TextField und eine Login Button in meiner Homepage hinzuzufügen. Nach erfolgreicher Anmeldung, wenn die Callback-Funktion ausgeführt wird, möchte ich den Wert TextField von diesem Rückruf erfassen. Gibt es eine Möglichkeit, das zu tun? Jede Hilfe wird sehr geschätzt.

Dies ist der Körper meiner HTML-Seite

<body> 
    <div class="container"> 

     <div class="jumbotron text-center"> 
      <p>Login or Register with:</p> 
      <a href="/auth/facebook" class="btn btn-primary"><span class="fa fa-facebook"></span> Facebook</a> 
     </div> 
    </div> 
</body> 

Und das ist mein nod.js Code:

app.get('/auth/facebook', passport.authenticate('facebook')); 

app.get('/auth/facebook/callback', passport.authenticate('facebook', { 
    successRedirect : '/dashboard', 
    failureRedirect : '/' 
})); 

app.get('/dashboard', isLoggedIn, function(req, res){ 
    res.render('dashboard.ejs', { 
     user : { 
      name : req.user.facebook.name, 
      profilePic : req.user.facebook.profilePic 
     } 
    }); 
}); 

Grundsätzlich Ich möchte nur eine zusätzliches TextField kurz vor meiner LogIn Schaltfläche hinzufügen. Und von der Route /dashboard möchte ich den Wert TextField bekommen. Also mein Code für /dashboard wird wie folgt aussehen:

app.get('/dashboard', isLoggedIn, function(req, res){ 
    res.render('dashboard.ejs', { 
     user : { 
      role: VALUE_FROM_TEXT_FIELD, 
      name : req.user.facebook.name, 
      profilePic : req.user.facebook.profilePic 
     } 
    }); 
}); 

So habe ich eine doppelte Frage: 1. Wie diesen TextField Wert vom Frontend zu übergeben. Sollte es in einem Form oder was? 2. Wie kann ich den Wert der TextField innerhalb der /dashboard Route erfassen?

+0

Können Sie ein Beispiel für Ihre Arbeit geben? Ich vermute, dass Sie in der Lage sein sollten, die Callback-URL zu verwenden, um diese – Pogrindis

Antwort

0

Haben Sie überlegt, einen benutzerdefinierten Rückruf anstelle des standardmäßigen Passport.js zu verwenden?

Ein Beispiel für die ‚lokale‘ Strategie ist:

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 

Sie sollten in dem zusätzlichen Wert in der Anforderung und verarbeitet es in der Callback passieren können.

EDIT: Für Ihr spezielles Szenario, sind Sie wahrscheinlich auf etwas entlang der Linien von dieser Suche ...

app.get('/auth/facebook/callback', function (req, res, next) { 
    passport.authenticate('facebook', function (err, user, info) { 
     if (err) { 
      return next(err); 
      // let the next route handler do its thing... 
      // or you can handle the error yourself within this 
      // callback. 
     } 

     // if the user returns as nothing (doesn't exist) then redirect 
     if (!user) { 
      // this takes the place of failureRedirect 
      return res.redirect('/'); 
     } 
     req.logIn(user, function (err) { 
      if (err) { 
       return next(err); // again - on error, 'next' depending on your requirement. 
      } 
      // this takes the place of successRedirect 
      return res.redirect('/dashboard'); 
     }); 
    })(req, res, next); 
}); 

Hoffentlich klärt :)

+0

zurückgeben Ich habe meine Frage bearbeitet. Können Sie mir sagen, wie ich die Daten in meinem gegebenen Szenario bekommen kann? Ich konnte einen benutzerdefinierten Rückruf wie Ihr Beispiel verwenden und kann die Daten von req-Objekt abrufen. Aber für mein Beispiel brauche ich die Daten nach dem Login ist erfolgreich. – user1120675

+0

Aktualisiert. Hoffentlich hilft das. – Ant

+0

Entschuldigung. Ich habe gerade gemerkt, dass ich den Sinn dessen vermisst habe, was Sie tun. Können Sie mitteilen, wie Sie die Strategie konfigurieren? dh. pass.use (neue FacebookStrategie (..) – Ant

0

Was ich einen Pass tat benutzerdefinierte Funktion anstelle von sucessRedirect und übergeben Sie es die Variable müssen. In meinem Fall war es req.session.backurl, das verwendet wurde, um sie an die Seite zurückzuschicken, für die sie authentifiziert werden mussten.

users.get('/auth/facebook/callback', 
     //req.session.backURL|| 
    passport.authenticate('facebook', { failureRedirect: '/login' }),function(req,res){ 
res.redirect(req.session.backURL||'/'); //custom function used instead of sucessRedirect 

});