Quindi ho cercato di imparare il più possibile sulla tokenizzazione JWT e auth0 sembra essere il vero hub di informazioni JWT.
Tuttavia, più leggo sui token di aggiornamento, più mi cruccio: l'idea stessa di un "infinitamente" aggiornabile (o per lo meno una scadenza molto lunga) non si adatta a me.
Quindi ecco cosa ho deciso di implementare.
L'architettura del sistema: 1. API (puro livello API, anche il server di autenticazione al momento): crea i token e li convalida 2. Livello applicazione (richieste di gestione delle boccette).
Quando un utente tenta di accedere all'app, vengono inviati alla pagina di accesso. Inseriscono i loro dettagli e questi vengono inviati all'endpoint / authorize sull'API.
Questi dettagli sono convalidati e un token creato con un reclamo contenente: "iat" rilasciato a "exp" scadenza 30 minuti "oct" ora originale creata
Per quanto riguarda il server di autenticazione e l'API, questo token scadrà tra 30 minuti.
Ora sul livello App, ogni richiesta controlla il token e vede se rimangono meno di 5 minuti prima della scadenza.
Se trova lì, crea il proprio JWT (firmato con lo stesso segreto dell'API). Usa il JWT originale (che sta per scadere) come oggetto payload, quindi lo invia a un endpoint su auth / refresh_token
L'endpoint / refresh_token quindi convalida il token, estrae il token originale dal payload, lo convalida e se è un token valido (non ancora scaduto). Quindi controlla l'ora originale creata e si assicura che non sia stato raggiunto un timeout massimo (impostato dal cliente della nostra App) - questo è un limite rigido del sistema di 12 ore (ma i nostri clienti possono optare per sessioni totali più brevi). Se questi controlli sono OK, crea un NUOVO token e lo rimanda all'App Layer.
In questo modo, il mio pensiero è:
-
Il server di autenticazione può sempre considerare attendibile questa richiesta di aggiornamento, poiché deve ricevere un JWT attendibile che contenga il JWT originariamente creato dal server di autenticazione. Ciò significa che potrebbe essere stato creato solo dall'App Layer (o da qualsiasi server con il segreto).
-
Il server di autenticazione non distribuisce infinitamente token di aggiornamento.
-
Se il segreto è compromesso - sei comunque un proverbiale, e finché non sai che è stato compromesso, non c'è molto che puoi fare - ovviamente abbiamo pedine IP per garantire che le richieste di JWT provengano da fonti attendibili, ma ancora: lo spoofing IP non è difficile se l'hacker sapeva cosa stavano facendo.
-
L'App Layer, ha la capacità di interrompere l'invio di aggiornamenti uccidendo la sessione utente - quindi un JWT compromesso sarebbe solo "pericoloso" per un massimo di 30 minuti.
Un sacco di persone si preoccupano molto della sicurezza, e giustamente - ma diresti che questo approccio fornisce controlli e saldi adeguati?
In caso contrario, mi piacerebbe sentire idee, miglioramenti nel processo, ecc. La sicurezza non è sicuramente il mio strong seme, quindi tutto l'aiuto sarà molto apprezzato!
Saluti.