Accesso al token JWT e disconnessione

12

Ciao Sto creando un'applicazione mobile nativa che utilizza endpoint REST API per comunicare con il lato server. Ho avuto esperienze precedenti nello sviluppo di client nativi, ma ho un token semplice (stringa generata casualmente) memorizzato nel DB nella stessa tabella in cui sono archiviate le informazioni dell'utente. Quindi è come le sessioni usate nel browser, ma invece dei cookie ogni richiesta ha un token nell'intestazione.

Recentemente ho scartato il token JWT. Sembra essere un ottimo modo per proteggere endpoint privati. Puoi richiedere il token dal client mobile fornendo pass + login e ricevi token generati in risposta. Ma l'unica cosa importante è che questo token non è memorizzato da nessuna parte sul server, il server verifica il token usando la parola segreta, che è privata per il server come la chiave privata. Va bene per gli endpoint protetti, ma cosa fare se richiedo una sessione utente, ad esempio come funzionano le app come Facebook, Amazon, Aliexpress ... hanno la capacità di utilizzare l'app senza fornire credenziali, semplicemente navigando nel negozio, ma richiede l'accesso quando l'utente non vuole effettuare l'acquisto. E dopo quella sessione utente viene tenuta per un po 'di tempo. Questo può essere implementato con il token JWT senza problemi, ma quando l'utente deve disconnettersi, cosa fare in questo caso? Il token non è memorizzato da nessuna parte sul server, quindi come posso distruggere questo token, per renderlo non valido?

Se il token è memorizzato nel database, l'API non è stateless, come dovrebbe essere l'API REST. Quindi in generale non c'è modo di tenere l'utente loggato in API senza stato, ho ragione?

Ho alcune idee su come implementarlo usando il token JWT, ma ancora una volta questa non sarà API stateless, come ho capito.

  1. Crea l'elenco dei token scaduti
  2. Conserva il token JWT nel database, ma qual è lo scopo del token auto descrittivo (JWT) in questo caso se è archiviato nel database, l'idea principale del token JWT di conservare tutte le informazioni con il token, come so.

Per favore suggerisci quale sarà il modo migliore in questo caso e correggimi se ho sbagliato. Grazie.

    
posta eemrxoha 02.10.2015 - 21:16
fonte

1 risposta

2

I token JWT sono progettati principalmente come meccanismo di asserzione, ovvero forniscono le informazioni utente rilevanti per consentire al server di "conoscere" l'utente per conto del quale viene eseguita l'operazione. JWT è perfetto per il seguente scenario

  1. Non è possibile accedere alle informazioni utente sul lato server senza il coinvolgimento dell'utente, ma sono necessarie alcune informazioni di base per le chiamate offline.
  2. Provisioning JIT per trasferire i dettagli dell'utente da un sito a un altro (aka federazione).
  3. Operazione Session / Stateless con dati limitati, ovvero hai bisogno di dati utente specifici per ogni transazione ma non hai il concetto di sessione (ad esempio API, sistema di elaborazione eventi)

Anche se sembra essere usato per la sessione, penso, non è il migliore usato per lo stesso.

OAuth è più appropriato, penso, per la gestione delle sessioni. È progettato con concetti di base come token di aggiornamento (estensione di sessione in caso di scadenza della sessione), token di accesso (id di sessione) che si associa facilmente ai concetti di gestione delle sessioni. In caso di OAuth, il metodo di autenticazione (come JWT) deve essere deciso dal server. Dopo di ciò, l'unica cosa che il client ha bisogno per la durata della sessione è un token di accesso (simile all'ID di sessione). Il più grande problema che ho riscontrato è che i token di accesso e i token di aggiornamento devono essere archiviati e gestiti sul server. Se riesci facilmente a mappare il token di accesso all'ID di sessione, penso che tu possa rimuovere quella necessità. Ma dato che stai già lavorando alla memorizzazione di JWT, questo dovrebbe essere un problema per te.

    
risposta data 03.10.2015 - 18:28
fonte

Leggi altre domande sui tag