Comprendere lo scambio di token in OAuth/OIDC
Lo scambio di token è un'estensione di OAuth che consente ai client fidati di ottenere nuovi token senza l'interazione con l'utente, utile per l'impersonificazione, l'automazione, l'integrazione tra sistemi e la migrazione dei token in vari scenari.
Introdotto in RFC 8693, lo scambio di token è un'estensione di OAuth che consente ai client fidati di scambiare un token esistente per uno nuovo con attributi o ambiti diversi. Questo meccanismo è particolarmente utile per un servizio, un'applicazione o un utente finale per ottenere un normale token di accesso OAuth tramite un token pre-autorizzato, senza la necessità di passare attraverso il flusso completo di OAuth.
Confronto con il flusso del codice di autorizzazione
Innanzitutto, diamo un'occhiata al flusso del codice di autorizzazione di OAuth, che è il flusso più comune per ottenere un token di accesso.
E questo è il flusso di scambio dei token:
Reindirizzamento
La principale differenza è che nel flusso del codice di autorizzazione, l'applicazione client reindirizza l'utente al server di autorizzazione per ottenere un token di accesso. Nello scambio di token, l'applicazione client può scambiare un token con il server di autorizzazione senza coinvolgere l'utente nel reindirizzamento.
Questo perché nel flusso del codice di autorizzazione, l'applicazione client non è "fidata" e deve conoscere le credenziali dell'utente per ottenere un token di accesso. Nello scambio di token, l'applicazione client è fidata per aver già ottenuto il token dall'utente e il server di autorizzazione convaliderà il token e ne emetterà uno nuovo.
Emettitore di token e servizio di scambio di token
Nel flusso di scambio di token, il "Server di Autorizzazione" è ora due partecipanti:
- Emettitore di token: emette il token soggetto all'applicazione client.
- Servizio di scambio di token: convalida il token soggetto ed emette un nuovo token all'applicazione client.
Il servizio di scambio di token è lo stesso del "Server di Autorizzazione" nel flusso del codice di autorizzazione e l'emettitore di token può essere un provider di identità di terze parti o diviso dal "Server di Autorizzazione" come un servizio dedicato.
Quando utilizzare lo scambio di token?
Il flusso di scambio di token può essere eseguito senza interazione dell'utente, questo è utile nei seguenti scenari:
- Impersonificazione: Consentire ai servizi (ad esempio, microservizi di backend) o agli utenti admin di eseguire azioni per conto di un utente senza esporre le credenziali complete dell'utente.
- Automazione: Consentire ai servizi fidati di eseguire azioni automaticamente senza intervento manuale, o eseguire test automatizzati.
- Integrazione con altri IdP: Tradurre i token attraverso diversi sistemi di identità per mantenere un'esperienza utente senza soluzione di continuità e gestire efficacemente le autorizzazioni, uno scenario comune è tradurre un token SSO in un token per un servizio a valle.
- Migrazione: Migrare i token da un server di autorizzazione a un altro, ad esempio, da un sistema legacy a un sistema moderno compatibile con OAuth/OIDC.
Processo di scambio di token
Scambiare per un nuovo token di accesso è il caso d'uso più comune, prenderemo questo come esempio. Non limitato al token di accesso, lo scambio di token può essere utilizzato anche per emettere altri tipi di token come token di aggiornamento, token di ID, ecc.
Applicazione client
Per eseguire lo scambio di token, è richiesta un'applicazione client registrata con il server di autorizzazione.
E l'applicazione client deve avere un subject_token
prima di avviare il flusso di scambio di token, questo token è solitamente concesso dal server di autorizzazione o dal fidato provider di identità di terze parti. Avendo questo token, l'applicazione client può ora essere "fidata" per scambiare i token senza la necessità delle credenziali e dell'interazione dell'utente.
Richiesta di scambio di token
Il client invia una richiesta al punto finale del token del server di autorizzazione per scambiare un token esistente. Ciò include il subject_token
(il token in fase di scambio) e opzionalmente, il pubblico target desiderato, l'ambito e il tipo di token.
grant_type
: OBBLIGATORIO. Il valore di questo parametro deve essereurn:ietf:params:oauth:grant-type:token-exchange
che indica che è in corso uno scambio di token.subject_token
: OBBLIGATORIO. Il PAT dell'utente.subject_token_type
: OBBLIGATORIO. Il tipo di token di sicurezza fornito nel parametrosubject_token
. Un valore comune di questo parametro èurn:ietf:params:oauth:token-type:access_token
, ma può variare in base al token in fase di scambio.resource
: OPZIONALE. L'indicatore della risorsa, aiuta a specificare la risorsa target per il token di accesso.audience
: OPZIONALE. Il pubblico del token di accesso, che indica i destinatari previsti del token, il server di autorizzazione può utilizzare il valore diresource
seaudience
non è specificato.scope
: OPZIONALE. Gli ambiti richiesti.
Inoltre, la richiesta deve includere le informazioni del client, che possono essere codificate come intestazione di autenticazione di base o inviate come dati del modulo.
Ecco un esempio di richiesta:
Scambio di token in Logto
Logto supporta lo scambio di token nativamente, inclusi l'impersonificazione e i token di accesso personale.