Begrip van tokenuitwisseling in OAuth/OIDC
Tokenuitwisseling is een OAuth-uitbreiding waarmee vertrouwde clients nieuwe tokens kunnen verkrijgen zonder gebruikersinteractie, nuttig voor impersonatie, automatisering, cross-systeem integratie en tokenmigratie in verschillende scenario's.
Geïntroduceerd in RFC 8693, is tokenuitwisseling een OAuth-uitbreiding die vertrouwde clients toestaat om een bestaand token om te wisselen voor een nieuwe met andere attributen of scopes. Dit mechanisme is vooral nuttig voor een service, een applicatie of een eindgebruiker om een normaal OAuth-toegangstoken te verkrijgen via een vooraf geautoriseerd token, zonder de volledige OAuth-flow te hoeven doorlopen.
Vergelijking met autorisatiecode-flow
Laten we eerst eens kijken naar de OAuth Autorisatiecode-flow, wat de meest gebruikelijke flow is om een toegangstoken te verkrijgen.
En dit is de tokenuitwisselingsflow:
Omleiding
Het belangrijkste verschil is dat in de autorisatiecode-flow de clientapplicatie de gebruiker omleidt naar de autorisatieserver om een toegangstoken te verkrijgen. In de tokenuitwisseling kan de clientapplicatie een token omwisselen met de autorisatieserver zonder de gebruiker te betrekken bij de omleiding.
Dat komt omdat in de autorisatiecode-flow de clientapplicatie niet "vertrouwd" is en de inloggegevens van de gebruiker moet kennen om een toegangstoken te verkrijgen. In de tokenuitwisseling wordt de clientapplicatie vertrouwd omdat het al een token van de gebruiker heeft verkregen, en de autorisatieserver valideert het token en geeft een nieuwe uit.
Tokenuitgever en tokenuitwisselingsservice
In de tokenuitwisselingsflow zijn de "Auth Server" nu twee deelnemers:
- Tokenuitgever: geeft het subject token aan de clientapplicatie uit.
- Tokenuitwisselingsservice: valideert het subject token en geeft een nieuw token aan de clientapplicatie uit.
De tokenuitwisselingsservice is hetzelfde als de "Auth Server" in de autorisatiecode-flow, en de tokenuitgever kan een externe identiteitsprovider zijn, of gesplitst van de "Auth Server" als een speciale service.
Wanneer tokenuitwisseling gebruiken?
Tokenuitwisseling kan worden uitgevoerd zonder gebruikersinteractie, dit is nuttig in de volgende scenario's:
- Impersonatie: Laat services (bijv. backend-microservices) of admin-gebruikers acties uitvoeren namens een gebruiker zonder volledige gebruikersgegevens bloot te leggen.
- Automatisering: Sta toe dat vertrouwde services automatisch acties uitvoeren zonder handmatige tussenkomst, of voer geautomatiseerde tests uit.
- Integratie met andere IdP's: Zet tokens om tussen verschillende identiteitsystemen om een naadloze gebruikerservaring te behouden en effectief rechten te beheren, een veelvoorkomend scenario is het omzetten van een SSO-token naar een token voor een downstream-service.
- Migratie: Migreer tokens van de ene autorisatieserver naar de andere, bijvoorbeeld van een legacy-systeem naar een modern OAuth/OIDC-compliant systeem.
Tokenuitwisselingsproces
Het omwisselen van een nieuw toegangstoken is de meest voorkomende gebruikssituatie, we nemen dit als voorbeeld. Niet beperkt tot toegangstoken, tokenuitwisseling kan ook worden gebruikt om andere soorten tokens uit te geven, zoals verversingstoken, ID-token, enz.
Clientapplicatie
Om tokenuitwisseling uit te voeren is een geregistreerde clientapplicatie met de autorisatieserver vereist.
En de clientapplicatie moet vooraf een subject_token
hebben om de tokenuitwisselingsflow te starten, dit token wordt meestal verleend door de autorisatieserver of de vertrouwde externe identiteitsprovider. Door dit token te hebben, kan de clientapplicatie nu "vertrouwd" worden om tokens uit te wisselen zonder de inloggegevens en interactie van de gebruiker.
Tokenuitwisselingsverzoek
De client stuurt een verzoek naar het toekenpunt van de autorisatieserver om een bestaand token om te wisselen. Dit omvat het subject_token
(het token dat wordt uitgewisseld) en eventueel de gewenste doelpubliek, scope en tokentype.
grant_type
: VERPLICHT. De waarde van deze parameter moeturn:ietf:params:oauth:grant-type:token-exchange
zijn, wat aangeeft dat een tokenuitwisseling wordt uitgevoerd.subject_token
: VERPLICHT. De PAT van de gebruiker.subject_token_type
: VERPLICHT. Het type beveiligingstoken dat in de parametersubject_token
wordt opgegeven. Een veelvoorkomende waarde van deze parameter isurn:ietf:params:oauth:token-type:access_token
, maar het kan variëren afhankelijk van het token dat wordt uitgewisseld.resource
: OPTIONEEL. De resource-indicator, helpt om de doelresource voor het toegangstoken te specificeren.audience
: OPTIONEEL. Het publiek van het toegangstoken, aangevend de beoogde ontvangers van het token, de autorisatieserver kan de waarde vanresource
gebruiken alsaudience
niet is gespecificeerd.scope
: OPTIONEEL. De gevraagde scopes.
Ook moet het verzoek de clientinformatie bevatten, die kan worden gecodeerd als een Basic Auth-header of als formuliervulling worden verzonden.
Hier is een voorbeeld van een verzoek:
Tokenuitwisseling in Logto
Logto ondersteunt standaard tokenuitwisseling, inclusief impersonatie en persoonlijke toegangstokens.