2014-09-17 8 views
5

Załóżmy, że potrzebuję dwóch różnych paszportów w ramach jednej ekspresowej aplikacji (na przykład pokój użytkownika &). więc określić dwa oddzielne vars:PassportJS - Korzystanie z wielu paszportów w ramach aplikacji Express

var passport = require('passport'); 
var roomPassport = require('passport'); 

następnie zainicjować ich odrębnych strategii paszportowych:

require('./config/passport')(passport); // pass passport for configuration 
require('./config/roompassport')(roomPassport); // pass passport for configuration 

ostatnim krokiem jest ustawienie ich jako ekspresowe middleware:

// required for passport 
application.use(session({ secret: 'ilovepassport;-)' })); // session secret 
application.use(passport.initialize({ userProperty: "user" })); 
application.use(passport.session()); // persistent login sessions 
application.use(roomPassport.initialize({ userProperty: "room" })); 
application.use(roomPassport.session()); // persistent login sessions 
application.use(flash()); // use connect-flash for flash messages stored in session` 

Jeśli jednak zrobię to w ten sposób, w zasadzie roomPassport zastępuje paszport i zamiast dwóch obiektów - req.user i req.room, mam tylko jeden pokój, ale zainicjowany dane użytkownika.

Należy wspomnieć, że każdy paszport (użytkownik lub pokój) może uwierzytelniać się niezależnie od siebie, tj. Istnieje scenariusz, w którym muszą istnieć oba obiekty req.user i req.room.

Jak rozwiązać ten problem?

EDIT 1

Cóż, po kilka godzin, wydaje się, że chociaż muszę oddzielne obiekty paszport, po wezwaniu application.use(roomPassport.initialize({ userProperty: "room" }));, robi się bałagan - a to dlatego, req.login() metoda działa z ostatnim załączonym paszportem . Zamiast więc wywoływać poprawną metodę, wywołuje ona metodę .

Moje następne pytanie - jak wprowadzić req.login() w celu wywołania właściwej metody?

Odpowiedz

9

Problem polega na tym, że moduł paszportowy eksportuje utworzony obiekt paszportu, gdy jest to wymagane. A ponieważ obiekt ten jest buforowany przez węzeł, kiedy go potrzebujesz, za każdym razem dostajesz ten sam obiekt.

Na szczęście moduł paszportowy daje również reference to the class, co oznacza, że ​​możesz to zrobić.

var Passport = require('passport').Passport, 
    passport = new Passport(), 
    roomPassport = new Passport(); 

Teraz powinieneś mieć dwa zupełnie oddzielne obiekty paszportowe.

+0

Dzięki stary, uratowałeś mi dzień! Rozwiązuje mój problem, ale nie całkowicie. Wygląda na to, że będę potrzebować osobnych paszportów, ponieważ w przeciwnym razie oba obiekty haseł będą miały pierwszeństwo przed tym samym plikiem cookie. Moje następne pytanie brzmi: jak ustawić dwie oddzielne sesje (prawdopodobnie je nazwać)? –

+0

Po prostu stawiam to jako nowe pytanie tutaj http://stackoverflow.com/questions/25898629/passportjs-how-to-make-separate-passport-session –

+0

Hej, poszedłem za twoją radą, a także stworzyłem dwa różne pliki konfiguracyjne paszportu obsłużyć dwie lokalne strategie diff. Jednak przy próbie zalogowania się przy użyciu oryginalnego błędu pojawia się komunikat "Nieznana strategia lokalnego logowania". – codeinprogress

Powiązane problemy