/ / Autentica per token, quindi per sessione se il token fallisce, usando il passaporto? - javascript, node.js, authentication, express, passport.js

Autentica tramite token, quindi per sessione se il token fallisce, usando il passaporto? - javascript, node.js, authentication, express, passport.js

Sto lavorando per adattare un'applicazione web esistente con un back-end NodeJS + Express a un'app PhoneGap / Steroids. Attualmente l'autenticazione per la webapp è gestita da Passport (http://passportjs.org/) usando le sessioni.

app.use( passport.initialize() );
app.use( passport.session() );

Funziona alla grande in un browser. Sfortunatamente sembra che i cookie di sessione non funzionino in PhoneGap. Quindi le richieste inviate al server vengono semplicemente respinte.

La soluzione consigliata per PhoneGap è invece quella di utilizzare una strategia token, in cui un token univoco è incluso in ogni richiesta al server, come in un endpoint api.

Quindi, ecco cosa mi chiedo:

È possibile adattare passport.session () in modo tale che se non viene trovato alcun cookie di sessione, verrà invece controllato un req.token e autorizzato contro di esso?

Prendo atto che sono già disponibili alcune strategie basate su token per Passport. (per esempio https://www.npmjs.org/package/passport-http-bearer) Tuttavia tutte queste strategie sembrano assumerequelle sessioni non saranno usate e saranno disattivate. Quello di cui ho veramente bisogno è di usare entrambi, quindi se una autenticazione fallisce (es. Sessione), può passare e controllare contro un'altra autenticazione (token).

Qualcuno ha implementato qualcosa sulla falsariga di questo? Qualsiasi suggerimento / suggerimento sarebbe apprezzato.

risposte:

1 per risposta № 1

Questo è quasi esattamente lo stesso caso d'uso che ci porta a scrivere un modulo middleware di sessione Web Token JSON. Se stai usando Redis, dovrebbe adattarsi bene al tuo stack.

https://www.npmjs.org/package/jwt-redis-session

Se si modifica l'inizializzazione requestKeyparametro per qualcosa come "jwtSession" invece di "sessione" è possibile eseguire questo middleware insieme al middleware di sessione basato su cookie esistente. Quindi nei percorsi è possibile controllare req.session.whatever o req.jwtSession.whatever e gestire funzionalità di livello superiore indipendentemente dal meccanismo di trasporto cookie / JWT.

Potrebbe essere necessario modificare la strategia del passaporto e / o le funzioni di serializzazione / deserializzazione, ma non dovrebbe essere troppo lavoro per unire questo middleware in un'applicazione esistente basata su passaporto.

Indipendentemente dal fatto che tu voglia o meno usarlomodulo Penso che dovresti prendere in considerazione l'utilizzo di qualcosa basato su Token Web JSON. Quando un utente effettua l'autenticazione, il server invierà il proprio token all'app PhoneGap che invierà quindi il token in ogni richiesta successiva. Qui il JWT sostituirà semplicemente la funzionalità di supporto dei browser tramite i cookie. Può essere un po 'complicato gestire le scadenze di sessione tramite JWT dal momento che la scadenza è inserita nelle rivendicazioni, quindi è impossibile "aggiornare" il TTL di una sessione senza rigenerare un nuovo token. Questo è ciò che ci fa ricadere redis per gestire le scadenze.

In entrambi i casi quello che stai cercando non è unUUID generato casualmente, ma un token crittografato, ad esempio un JWT, che contiene dati di identificazione della sessione quanto basta per sostituire la funzionalità dei cookie.