2014-09-17 13 views
5

Supponiamo ho bisogno di due passaporti diversi all'interno di un Application Express (ad esempio utente & camera). Così mi definisco due Vars distinte:PassportJS - Utilizzo di più passaporti entro Application Express

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

allora, li ho inizializzo con le strategie di passaporto separati:

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

l'ultimo passo è quello di impostare loro come espresso 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` 

tuttavia, se l'ho fatto in questo modo, in effetti roomPassport ha la precedenza sul passaporto e invece di avere due oggetti - req.user e req.room, ho ottenuto solo un req.room ma inizializzato con dati utente.

È importante ricordare che ciascun passaporto (utente o locale) potrebbe autenticarsi indipendentemente l'uno dall'altro, ovvero esiste uno scenario in cui devono esistere entrambi gli oggetti req.user e req.room.

Come risolvere questo?

EDIT 1

Bene, dopo qualche ora in più, sembra che anche se devo separare gli oggetti del passaporto, dopo la chiamata di application.use(roomPassport.initialize({ userProperty: "room" }));, le cose ottenere disordinato - e questo perché req.login() metodo funziona con l'ultimo passaporto allegato . Quindi, invece di chiamare il metodo corretto passport.serializeUser, chiama il metodo roomPassport.serializeUser.

mia prossima domanda - come fare req.login() di chiamare il metodo giusto?

risposta

9

Il problema vostro avere è che il modulo del passaporto esporta un oggetto Passport un'istanza quando necessario. E poiché quell'oggetto viene memorizzato nella cache per nodo quando lo si richiede, si ottiene sempre lo stesso identico oggetto.

Per fortuna, il modulo del passaporto ti dà anche un reference to the class, il che significa che si può fare questo.

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

Ora è necessario disporre di due oggetti passaporto completamente separati.

+0

Grazie amico, mi hai salvato la giornata! Risolve il mio problema ma non completamente. Sembra, che avrò bisogno di passport.sessions separati, poiché altrimenti gli oggetti password sostituiranno lo stesso cookie. Quindi la mia prossima domanda è: come impostare due sessioni separate (probabilmente nominarle)? –

+0

L'ho appena messo come nuova domanda qui http://stackoverflow.com/questions/25898629/passportjs-how-to-make-separate-passport-session –

+0

Ehi, ho seguito il tuo consiglio e ho anche creato due diversi file di configurazione del passaporto per gestire le due strategie locali diff. Tuttavia, quando provo ad accedere utilizzando quello originale, si genera un errore che dice "Script locale sconosciuto". – codeinprogress

Problemi correlati