2015-01-26 3 views
6

Mit Passport.js in Node, gibt es eine Möglichkeit für mich, dass ein Benutzer eine andere annehmen kann? z.B. Als Administrator in der Anwendung möchte ich in der Lage sein, mich als ein anderer Benutzer anzumelden, ohne sein Passwort zu kennen.Wie kann ich im Knoten einen anderen Benutzer mit Passport.js imitieren?

Am einfachsten wäre ich zufrieden, wenn ich die serialisierten Benutzerdaten (Benutzer-ID) ändern könnte, wenn deserializeUser aufgerufen wird, wird es einfach die Identität des alternativen Benutzers annehmen. Ich habe versucht, den Wert bei req._passport.session.user und den Wert bei req.session.passport.user zu ersetzen, aber der Nettoeffekt ist nur, dass meine Sitzung ungültig zu werden scheint, und Passport mich abmeldet.

Antwort

9

Passport bietet eine req.logIn Methode für den Fall, dass Sie die Authentifizierung manuell durchführen möchten. Sie können damit Benutzer unabhängig von der Authentifizierung anmelden.

So können Sie es verwenden. Lassen Sie den Admin normal anmelden, wer eine isAdmin Flag gesetzt hat.

Dann platzieren Sie eine Middleware vor passport.authenticate in Ihrer Login-Route. Dies wird die neue Benutzer nur auf ihren Benutzernamen anmelden, wenn die derzeit Benutzer isAdmin angemeldet ist.

app.post('/login', 

    function forceLogin(req, res, next) { 
     if (!req.user.isAdmin) return next(); // skip if not admin 
     User.findOne({ 
      username: req.body.username // < entered username 
     }, function(err, user) { 
      // no checking for password 
      req.logIn(user); 
      res.redirect('/users/' + user.username); 
     }); 
    }, 

    passport.authenticate('local'), 
    function(req, res) { 
     res.redirect('/users/' + req.user.username); 
    } 
); 
+1

Das habe ich vermisst! Vielen Dank! – user2719094

1

Die Antwort auf Ihre Frage ist grundsätzlich: nein. Der Grund ist folgender: Die Session-Bibliothek, die 99% der Zeit benutzt wird, signiert die Cookies. Wenn Sie also die Daten manipulieren, wird der Webserver sie ablehnen.

Der Weg um dies ist Ihre eigene Reisepassauthentifizierungsstrategie zu schreiben, die offensichtlich dies nicht tut, aber ich nehme an, Sie sprechen über die Arbeit mit den integrierten Strategien hier.

+0

Danke. Ich habe versucht, eine neue Strategie zu erstellen (meine bestehenden Strategien sind im Grunde genommen von dieser: http://code.tutsplus.com/tutorials/authenticating-nodejs-applications-with-passport--cms-21619), aber konnte es nicht erreichen Arbeit. Ich nahm an, dass es so war, weil ich versuchte, die Authentifizierungsmethode des Passes aufzurufen, während der Benutzer bereits angemeldet war. Wie kann ich einen bereits angemeldeten Benutzer "erneut authentifizieren"? – user2719094

+0

Nicht sicher, was Sie genau meinen? Die Authentifizierung eines Benutzers (zu jeder Zeit) erfolgt über den Middleware-Helper von pass.authenticate =) Sie können dies direkt mit einem eigenen Callback aufrufen, wenn Sie möchten. Dies könnte jedoch für einen neuen SO Post besser sein! – rdegges

+0

Ich stimme nicht zu, aber ich befürchte, dass ich keine Antwort bekomme, wenn ich es nicht tue ... Meine ursprüngliche Frage lautet: "Wie kann sich ein Benutzer mit Passport.js einen anderen ausgeben?" Die Sitzungsdiskussion war nur eine Art, wie ich dachte * könnte * funktionieren, aber anscheinend wird es nicht funktionieren. Ich habe immer noch keine Antwort auf meine ursprüngliche Frage. Gibt es eine andere Möglichkeit, den Benutzer zu ändern, von dem Passport denkt, dass er angemeldet ist? – user2719094

2

Ich habe eine andere Art und Weise zu imitieren, denn:

  • ich nicht mit Einbauten von Authentifizierungs-/Reisepass wie Sitzungsspeicher/Login/usw. zu verwirren wollten Sie müssen sie verstehen wirklich gut und auch sie sind anfällig für Änderungen, so würde ich sagen, es ist keine Option für mich.
  • Ich würde auch gerne in der Lage sein zu sagen, ob eine Aktion von Superuser (imitiert) oder normalen Benutzer (nicht imitiert) durchgeführt wird.

Was ich tue, ist:

  • Haben Sie eine Route für Benutzer mit Superadmin Rolle zu verkörpern, wie /superadmin/impersonate?username=normaluser1 die req.user.impersonated.userid = normaluser1.userid

  • setzt Dann habe ich eine Middleware, die überprüft, ob Benutzer Superadmin und imitierten:

    if (req.user.isAdmin & & req.user.impersonated) { req.user.userid = req.user.impersonated.userid; }

Auch habe ich this zu sein, um einen guten Artikel über Benutzeridentitätswechsel gefunden. Ähnlich wie mein Ansatz und gut für die Inspiration, etwas Ähnliches zu bauen.

Verwandte Themen