Per implementare un livello di autorizzazione e autenticazione in un'architettura distribuita, si utilizzano generalmente sistemi di gestione centralizzata dell'identità, come OAuth 2.0, OpenID Connect o Identity Provider (IdP) aziendali. L'autenticazione (verifica dell'identità) avviene tramite un fornitore esterno, dopo di che il risultato (solitamente un token) viene utilizzato per l'autorizzazione (concessione di permessi) in tutti i servizi.
Di solito, lo schema funziona così:
Esempio di codice per la convalida di un token JWT in Python tramite la libreria PyJWT:
import jwt from jwt.exceptions import InvalidTokenError def verify_jwt(token, public_key): try: payload = jwt.decode(token, public_key, algorithms=["RS256"]) return payload except InvalidTokenError: return None # esempio di utilizzo user_info = verify_jwt(received_token, public_key) if user_info: # accesso consentito pass else: # accesso negato pass
Caratteristiche chiave:
Domanda: È obbligatorio memorizzare tutte le informazioni sui diritti dell'utente direttamente all'interno del token JWT?
Non è obbligatorio. Per ridurre le dimensioni del token, di solito si include solo l'id dell'utente e un insieme minimo di diritti/ruoli. Le autorizzazioni dettagliate possono essere ottenute su richiesta dal server tramite richieste aggiuntive o profile claims caricati.
Domanda: I refresh token sono un elemento obbligatorio di tutte le architetture distribuite?
No, i refresh token sono necessari solo se è necessaria una sessione prolungata senza ripetuta autenticazione. In un'API stateless, di solito sono attivi solo access tokens di breve durata, mentre la logica di refresh viene implementata solo per client web o mobili.
Domanda: La sezione payload in JWT può essere crittografata?
Secondo lo standard JWT (RFC 7519), il payload viene solo firmato, ma non crittografato. Per la crittografia si utilizza un altro standard: JWE (JSON Web Encryption). Altrimenti, chiunque possieda il token può leggere il payload (ad esempio, tramite jwt.io):
import jwt jwt.decode(token, options={"verify_signature": False})