Autenticazione nei microservices
Ok, il nostro software è un ammasso di tanti piccoli e isolatissimi servizi, sembra tutto bello ma il mostro dell'autenticazione è sempre in agguato ed è pronto a complicarci la vita.
in effetti in una galassia così variegata riuscire a gestire i permessi per ogni utente sembra un'impresa impossibile o quanto meno troppo lenta per essere gestita in modo efficiente.
Per fortuna è stata inventata una geniale tecnica di autenticazione che prende il nome di JWT (si pronuncia giot). Appena ne capirete il funzionamento non ne potrete più fare a meno, anzi, probabilmente la userete in ogni vostro progetto anche se non è a microservices.
Il classico processo di autenticazione prevede di aprire una sessione in fase di login ma in questo caso è impossibile parlare di sessione di lavoro in quanto ogni servizio è per definizione essere isolato.
ok, allora iniziamo a dare all'utente un token e a passare ad ogni chiamata web questo token fra gli header di request. In questo modo sarà possibile ricavare il ruolo dell'utente dal token stesso.
Ma come? passando al servizio di autenticazione il token? certo. ovviamente dovrò far fronte ad un carico di lavoro esponenziale correndo il rischio di avere tra le mani un mostro mangia-risorse.
Il modo più semplice è fare in modo che il token stesso contenga le informazioni di ruolo utente senza doverlo cercare da altre parti.
E la sicurezza? E' proprio ora che JWT mostra tutta la sua genialità.
il token è una stringa divisa in tre parti (il punto divide le parti):
- la prima parte contiene in base64 le informazioni circa l'algoritmo di crittografia che uso
- la seconda parte contiene il mio ruolo ed eventuali altre informazioni completamente in chiaro.
- la terza parte contiene le stesse informazioni precendenti (1+2) ma crittografate con una chiave privata.
Ogni servizio potrà utilizzare le informazioni contenute nella seconda parte per gestire i permessi dell'utente. semplice, banale... ma chi mi garantisce che i dati non siano corrotti?
Semplicemente passerò il token al servizio di autenticazione che tramite la sua chiave privata potrà comprendere se i dati sono stati corrotti o no. Ma la velocità di questo controllo sarà drammaticamente più veloce di una ricerca a dbase perchè richiederà una semplice e banale applicazione della chiave privata.
Se poi questo controllo venisse effettuato automaticamente da un service gateway che in caso di corruzione sollevasse un errore bloccante... ecco garantita una sicurezza assoluta e al contempo una incredibile semplicità di gestione dei ruoli di sicurezza.
Come se questa semplicità non bastasse, in piena logica microservice è stato creato un servizio online estremamente completo ed efficiente (oltre ad essere free per un certo numero di utenti) per gestire:- registrazione
- login
- recupero password
- gestione ruoli
- controllo brute force
Sul sito jwt.io potrete trovare un praticissimo elaboratore javascript di jwt per testare in modo rapido il vostro token jwt e per controllare tramite chiave privata la sua autenticità
Dall'immagine qui sopra potete riconoscere facilmente le tre parti del token:
in rosso l'algoritmo di crittografia
in viola i dati in chiaro
in azzurro la prima e la seconda parte crittografata: per controllarne l'autenticità basta mettere la chiave privata
7 comments
qcWtsJbUiO
hDwvMSesAtH
FAEbwsYnPMUKZ
XpZVqCSsEahcbt
oKDjdcTC