Siamo in procinto di riscrivere la nostra API e vorremmo avere alcuni consigli.
Requisiti:
- L'autenticazione verrà eseguita da vari client (app per dispositivi mobili, estensione per browser, app per singola pagina)
- L'autenticazione verrà eseguita da vari domini (a.com, b.com ...)
- Gli utenti devono essere in grado di elencare le loro sessioni attive (token) e di revocarle.
Note:
- L'API non deve essere accessibile ad altri client oltre al nostro. Siamo responsabili dei clienti.
- Ci sono diversi servizi dietro quell'API
- Siamo un piccolo team di 2 sviluppatori per tale API.
Stiamo pensando di usare:
- un token generato in modo sicuro (valore casuale) tra il client e il gateway API
- una JWT tra il gateway API e le API dei servizi interni.
Ci consentirà di ridurre il numero di richieste tra il server di autenticazione e i servizi interni in quanto vi sarebbe una sola chiamata tra il server di autenticazione e il gateway API (per eseguire la conversione dal token casuale al JWT). I servizi interni dovrebbero convalidare il JWT da soli.
Questo è un compromesso perché perdiamo la "scalabilità" del JWT introducendo questo punto di traduzione. Tuttavia non stiamo servendo milioni di utenti, quindi non abbiamo bisogno di quella scalabilità. Inoltre questo servizio di traduzione persisterà in una tabella di traduzione che ci consentirà di fare il terzo punto delle nostre esigenze.
Q1. Pensi che ci manchi qualcosa e / o siamo Astronauti di architettura ?
Riguardo al servizio di traduzione. Stiamo progettando di utilizzare uuid v4 per il token generato e un datastore in memoria come redis per eseguire la traduzione. Il server di autenticazione creerà questo valore casuale e il JWT associato quando l'utente fornisce il nome utente e la password corretti. Pensiamo che lo svilupperemo utilizzando una libreria JWT.
Q2. Stiamo reinventando la ruota?
Modifica: Potremmo rimuovere la traduzione da token casuali a JWT usando sempre una JWT e una whitelist per poter fare il terzo punto delle nostre esigenze. Un piccolo vantaggio per l'utilizzo di uuid su JWT è la dimensione del payload.