2015-01-26 12 views
6

Utilizzando Passport.js nel nodo, c'è un modo per consentire a un utente di impersonare un altro? per esempio. come amministratore dell'applicazione, voglio essere in grado di accedere come un altro utente, senza conoscere la password.Come posso impersonare un altro utente con Passport.js nel nodo?

Più semplicemente, sarei soddisfatto se potessi cambiare i dati utente serializzati (ID utente) in modo che quando viene chiamato deserializeUser assumerà solo l'identità dell'utente alternativo. Ho provato a sostituire il valore a req._passport.session.user e il valore a req.session.passport.user ma l'effetto netto è solo che la mia sessione sembra non essere più valida e Passport mi disconnette.

risposta

9

Passport fornisce un metodo req.logIn nel caso in cui si desideri eseguire l'autenticazione manualmente. Puoi usarlo per accedere a qualsiasi utente anche a prescindere dall'autenticazione.

Ecco come è possibile utilizzarlo. Avere il login Admin normalmente, chi avrà un set di flag isAdmin.

Quindi inserire un middleware prima del passport.authenticate nel percorso di accesso. Questo accederà al nuovo nuovo utente basato sul proprio nome utente, se lo attualmente ha effettuato l'accesso all'utente isAdmin.

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

Questo è quello che mi mancava! Grazie! – user2719094

1

La risposta alla tua domanda è in pratica: no. Il motivo è questo: la libreria delle sessioni che viene utilizzata il 99% delle volte sta firmando i cookie, quindi se si manomettono i dati il ​​server web la rifiuterà.

Il modo per aggirare questo è scrivere la propria strategia di autenticazione del passaporto che ovviamente non lo fa, ma presumo che tu stia parlando di lavorare con le strategie integrate qui.

+0

Grazie. Ho provato a creare una nuova strategia (le mie strategie esistenti derivano fondamentalmente da questo: http://code.tutsplus.com/tutorials/authenticating-nodejs-applications-with-passport--cms-21619), ma non sono riuscito a ottenerlo lavoro. Ho pensato che fosse perché stavo cercando di chiamare il metodo di autenticazione del passaporto mentre l'utente era già loggato. Come posso "riautenticare" un utente già registrato? – user2719094

+0

Non sei sicuro di cosa intendi esattamente? Il modo per autenticare un utente (in qualsiasi momento) è tramite l'helper middleware di passport.authenticate =) Puoi chiamarlo direttamente con una tua callback se lo desideri. Questo potrebbe essere meglio per un nuovo post SO! – rdegges

+0

Non sono d'accordo, ma temo di non ottenere una risposta a meno che non lo faccia ... La mia domanda iniziale è "come può un utente impersonare un altro usando Passport.js?" La discussione della sessione era solo un modo in cui pensavo che * potesse * funzionare, ma a quanto pare non lo sarebbe. Non ho ancora una risposta alla mia domanda iniziale. C'è un altro modo per CAMBIARE l'utente che Passport ritiene sia connesso? – user2719094

2

ho un altro modo di impersonare, perché:

  • non volevo fare confusione con interni di autenticazione/passaporto come memorizzazione delle sessioni/login/ecc Si deve capirle davvero bene e anche loro sono inclini a cambiare quindi direi che non è un'opzione per me .
  • Inoltre, vorrei ancora essere in grado di dire se l'azione viene eseguita dal superutente (rappresentato) o dall'utente normale (non rappresentato).

Quello che faccio è:

  • Avere un percorso per l'utente con il ruolo superadmin di impersonare, come /superadmin/impersonate?username=normaluser1 che definisce req.user.impersonated.userid = normaluser1.userid

  • Poi ho un middleware, che verifica se l'utente è superadmin ed è rappresentato:

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

Inoltre, ho trovato this per essere un buon articolo sulla rappresentazione dell'utente. Simile al mio approccio, e buono per l'ispirazione per la costruzione di qualcosa di simile.

Problemi correlati