2015-01-26 6 views
6

Korzystając z usługi Passport.js w węźle, czy istnieje sposób na umożliwienie jednemu użytkownikowi podszywania się pod innego? na przykład. jako administrator w aplikacji chcę mieć możliwość zalogowania się jako inny użytkownik bez znajomości hasła.Jak mogę podszyć się pod innego użytkownika przy użyciu Passport.js w węźle?

Po prostu byłbym usatysfakcjonowany, gdybym mógł zmienić zserializowane dane użytkownika (identyfikator użytkownika), więc gdy zostanie wywołana deserializeUser, po prostu przyjmie tożsamość alternatywnego użytkownika. Próbowałem zastąpić wartość na req._passport.session.user i wartości na req.session.passport.user, ale efekt netto jest po prostu, że moja sesja wydaje się stać nieważne i paszport rejestruje mnie.

Odpowiedz

9

Paszport zapewnia metodę req.logIn na wypadek, gdy chcesz ręcznie wykonać uwierzytelnianie. Możesz go użyć do zalogowania się do dowolnego użytkownika, nawet bez uwierzytelniania.

Oto jak z niego korzystać. Miej loginu administratora normalnie, kto będzie miał ustawioną flagę isAdmin.

Następnie umieść oprogramowanie pośredniczące przed passport.authenticate w swojej trasie logowania. To zalogować wyłącznie na podstawie swojej nazwy użytkownika nowy, jeśli obecnie zalogowany użytkownik 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

Tego właśnie mi brakowało! Dziękuję Ci! – user2719094

1

Odpowiedź na pytanie to w zasadzie: nie. Powodem jest to, że biblioteka sesji, która jest używana w 99% przypadków, podpisuje pliki cookie, więc jeśli manipulujesz danymi, serwer internetowy je odrzuci.

Sposobem na to jest napisać własną strategię uwierzytelniania paszportu, który oczywiście nie to zrobić, ale jestem zakładając, że mówimy o pracy z wbudowanymi strategiami tutaj.

+0

Dzięki. Próbowałem stworzyć nową strategię (moje istniejące strategie są zasadniczo następujące: http://code.tutsplus.com/tutorials/authenticating-nodejs-applications-with-passport-cms-21619), ale nie udało się jej uzyskać praca. Zakładałem, że to dlatego, że próbowałem wywołać uwierzytelnioną metodę paszportową, gdy użytkownik był już zalogowany. Jak mogę "ponownie uwierzytelnić" zalogowanego użytkownika? – user2719094

+0

Nie jesteś pewien, co masz na myśli? Sposób uwierzytelnienia użytkownika (w dowolnym momencie) odbywa się za pośrednictwem pomocnika middleware helper passport.authenticate =) Możesz zadzwonić bezpośrednio z własnym oddzwanianiem, jeśli chcesz. To może być lepsze dla nowego postu SO! – rdegges

+0

Nie zgadzam się, ale obawiam się, że nie dostanę odpowiedzi, chyba że zrobię ... Moje oryginalne pytanie brzmi: "w jaki sposób jeden użytkownik może podszywać się pod innego przy użyciu Passport.js?" Dyskusja sesyjna była tylko jednym ze sposobów, w jakie mogłem pracować *, ale najwyraźniej nie. Nadal nie mam odpowiedzi na moje oryginalne pytanie. Czy jest jakiś inny sposób ZMIENIENIA użytkownika, o którym uważa, że ​​Passport jest zalogowany? – user2719094

2

mam inny sposób personifikować, ponieważ:

  • nie chcą zadzierać z wewnętrznymi uwierzytelniania/paszport jak przechowywania sesji/login/itd. Musisz je zrozumieć naprawdę dobrze , a także są podatne na zmiany, więc powiedziałbym, że nie jest to opcja dla mnie .
  • Również chciałbym nadal być w stanie powiedzieć, czy działanie jest wykonany z superuser (wcieliła) lub zwykły użytkownik (nie podszył).

Co mogę zrobić, to:

  • Mają trasy dla użytkownika z roli superadmin personifikować, jak /superadmin/impersonate?username=normaluser1 który ustawia req.user.impersonated.userid = normaluser1.userid

  • Wtedy mam middleware, który sprawdza, czy użytkownik jest Podaje się:

    jeśli (req.user.isAdmin & & req.user.impersonated) { req.user.userid = req.user.impersonated.userid; }

Również znalazłem this być dobry artykuł o personifikacji użytkownika. Podobny do mojego podejścia i dobry do inspiracji do budowania czegoś podobnego.