Token exchange

O FoxIDs suporta dois cenários diferentes de token exchange: token exchange no mesmo ambiente e token exchange por trust para IdP/OP externo.

No mesmo ambiente, é possível fazer token exchange de access tokens numa aplicação web ou API/recurso para outro recurso.

Por trust externa, é possível fazer token exchange de access tokens externos e tokens SAML 2.0 para access tokens internos.

Samples

O token exchange está implementado nos seguintes samples:

Pode testar token exchange com o sample online de aplicação web (docs do sample) clicando em Log in e iniciando sessão com um IdP opcional. Depois clique em Call API1 which call API2 ou Token Exchange + Call Api2 para chamar uma API usando token exchange.
Veja a configuração do sample no FoxIDs Control: https://control.foxids.com/test-corp
Obtenha acesso de leitura com o utilizador reader@foxids.com e a password gEh#V6kSw

Configuração do registo de aplicação

É possível configurar se o token exchange é permitido no registo de aplicação OAuth 2.0 ou no cliente OpenID Connect. Da mesma forma, é possível configurar se o client credentials grant deve ser permitido. Por predefinição, tanto client credentials grant como token exchange são permitidos no registo de aplicação OAuth 2.0 e em clientes OpenID Connect.
Por predefinição, o cliente é adicionado como ator de token exchange; este comportamento pode ser desativado.

OAuth 2.0 client config

Token exchange no mesmo ambiente

É possível fazer token exchange de um access token emitido para um recurso e assim obter um access token para outro recurso no ambiente.
Um cliente de registo de aplicação é configurado para tratar o token exchange e para fazer whitelist dos recursos no ambiente para os quais está autorizado a fazer token exchange.

Access Token para Access Token em aplicação web

Uma aplicação web faz token exchange de um JWT access token para um JWT access token' no mesmo ambiente.

Neste cenário, um cliente OpenID Connect obteve um access token após a autenticação do utilizador.
O cliente também pode ser um cliente OAuth 2.0 que usa client credentials grant.

Token exchange, Access token to Access token in web application

O ambiente inclui dois recursos e o cliente OpenID Connect está autorizado a chamar diretamente tanto o primeiro como o segundo recurso. Para obter least privileges, o cliente OpenID Connect obtém apenas um access token para o primeiro recurso após a autenticação do utilizador. Depois obtém um access token para o segundo recurso quando este é necessário.

OpenID Connect client client - resource scopes

O primeiro access token é emitido com um scope/audience para o cliente OpenID Connect e o cliente passa assim a estar autorizado a trocar o access token por um access token' válido para o segundo recurso.
O cliente OpenID Connect é configurado com um secret como credenciais do cliente, usadas tanto na comunicação OpenID Connect como no token exchange.

Durante a sequência de token exchange, as transformações e limitações de claims são executadas no registo de aplicação OpenID Connect.

O cliente OpenID Connect faz um pedido de token exchange ao FoxIDs autenticando o cliente e passando o access token, enquanto pede (com um scope) um access token' para o segundo recurso. Se tiver sucesso, o cliente do recurso recebe um access token' e pode então chamar o segundo recurso com esse access token'.

Sample token exchange POST request to the token endpoint:

POST https://foxids.com/test-corp/-/aspnet_oidc_allup_online_sample(*)/oauth/token HTTP/1.1
Host: foxids.com
Content-Type: application/x-www-form-urlencoded

client_id=aspnet_oidc_allup_sample
&client_secret=IxIruKswG4sQxzOrKlXR58strgZtoyZPG18J3FhzEXI
&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&scope=aspnetcore_api2_sample%3Asome_2_access
&subject_token=accVkjcJyb4...UC5PbRDqceLTC
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token

Sample token exchange JSON response:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store

{
    "access_token":"eyJhGcjlc...nNjb3IIWvmDCM",
    "issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
    "token_type":"Bearer",
    "expires_in":600
}

Sample JWT access token' body:

{
    "sub": "2f18c344-1204-4629-b992-215913b85c2b",
    "auth_time": "1699955593",
    "amr": "pwd",
    "email": "test1@foxids.com",
    "role": ["role1","role2"],
    "name": "Test 1 user",
    "act": "{\"sub\":\"c_aspnet_oidc_allup_sample\"}",
    "scope": "aspnetcore_api2_sample:some_2_access",
    "client_id": "aspnet_oidc_allup_sample",
    "nbf": 1699955534,
    "exp": 1699956194,
    "iat": 1699955594,
    "iss": "https://foxids.com/test-corp/-/",
    "aud": "aspnetcore_api2_sample"
}

Access Token para Access Token em API

Uma API faz token exchange de um JWT access token para um JWT access token' no mesmo ambiente.

Neste cenário, um cliente OpenID Connect obteve um access token após a autenticação do utilizador.
O cliente também pode ser um cliente OAuth 2.0 que usa client credentials grant.

Token exchange, Access token to Access token in API

O ambiente inclui dois recursos e o cliente OpenID Connect está autorizado a chamar diretamente o primeiro recurso. O cliente OpenID Connect NÃO está autorizado a chamar diretamente o segundo recurso. No primeiro recurso, está configurado um cliente que permite que access tokens com a audience cliente/recurso sejam trocados por um access token' válido para o segundo recurso.
O cliente seguinte no primeiro recurso está configurado com um certificado como credencial do cliente.

OAuth 2.0 client on the first resource

Durante a sequência de token exchange, as transformações e limitações de claims são executadas no registo de aplicação.

O cliente OpenID Connect chama o primeiro recurso com o access token obtido. O cliente do recurso faz um pedido de token exchange ao FoxIDs autenticando o cliente e passando o access token enquanto pede (com um scope) um access token' para o segundo recurso. Se tiver sucesso, o cliente do recurso recebe um access token' e pode então chamar o segundo recurso com esse access token'.

Sample token exchange POST request to the token endpoint:

POST https://foxids.com/test-corp/-/aspnet_oidc_allup_online_sample(*)/oauth/token HTTP/1.1
Host: foxids.com
Content-Type: application/x-www-form-urlencoded

client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiI...kyX3NhbXBsZS
&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&scope=aspnetcore_api2_sample%3Asome_2_access
&subject_token=accVkjcJyb4...C5PbRDqceLTC
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token

Sample token exchange JSON response:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store

{
    "access_token":"eyJhGcRwczov...nNjb3BlIjoi",
    "issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
    "token_type":"Bearer",
    "expires_in":600
}

Sample JWT access token' body:

{
    "sub": "2f18c344-1204-4629-b992-215913b85c2b",
    "auth_time": "1699955841",
    "amr": "pwd",
    "act": "{\"sub\":\"c_aspnetcore_api1_sample\"}",
    "scope": "aspnetcore_api2_sample:some_2_access",
    "client_id": "aspnetcore_api1_sample",
    "nbf": 1699955786,
    "exp": 1699956446,
    "iat": 1699955846,
    "iss": "https://foxids.com/test-corp/-/",
    "aud": "aspnetcore_api2_sample"
}

Token exchange por trust

Por trust externa para IdP/OP, é possível fazer token exchange de um access token ou token SAML 2.0 emitido por uma parte externa (ou outro ambiente FoxIDs) e assim obter um access token para um recurso no ambiente.
É configurada uma trust de método de autenticação e é configurado um cliente de registo de aplicação para permitir token exchange com base nessa ou nessas trusts de método de autenticação. O cliente de registo de aplicação também faz whitelist dos recursos no ambiente para os quais está autorizado a fazer token exchange.

É possível configurar se a trust de método de autenticação deve ser permitida para token exchange e autenticação de utilizador. Por predefinição, ambos são permitidos em trusts de método de autenticação OAuth 2.0, OpenID Connect e SAML 2.0.

OAuth 2.0 trust config

Access Token para Access Token por trust

Token exchange de JWT access token externo para JWT access token interno por trust externa.

Neste cenário, um cliente OpenID Connect confia num OpenID Provider (OP) / Identity Provider (IdP) externo e obteve um access token após a autenticação do utilizador.
O cliente também pode ser um cliente OAuth 2.0 que usa client credentials grant para obter o access token externo.

Token exchange, Access token to Access token by trust

Existe um recurso no ambiente, mas o cliente OpenID Connect definido externamente NÃO está autorizado a chamar esse recurso diretamente.
Primeiro, é configurado um método de autenticação OAuth 2.0 ou OpenID Connect para confiar no OpenID Provider (OP) / Identity Provider (IdP) externo e o SP issuer é configurado para corresponder à audience do cliente OpenID Connect externo.
O exemplo seguinte de trust externa é uma trust para outro ambiente FoxIDs.

OAuth 2.0 authentication method trust

Depois, é configurado um cliente de registo de aplicação OAuth 2.0 para aceitar access tokens externos pela trust do método de autenticação. É possível ter uma ou mais trusts de método de autenticação.
O cliente seguinte está configurado com um secret como credenciais do cliente.

OAuth 2.0 application registration client for OIDC application

Torna-se assim possível fazer token exchange de um access token externo para um access token interno válido para o recurso.

Durante a sequência de token exchange, tanto as transformações como as limitações de claims são executadas primeiro no método de autenticação e depois no registo de aplicação.

O backend da aplicação cliente OpenID Connect faz um pedido de token exchange ao FoxIDs. Autentica o cliente OAuth 2.0 interno e passa o access token externo enquanto pede (com um scope) um access token para o recurso. Se tiver sucesso, o backend da aplicação cliente OpenID Connect recebe um access token e pode então chamar o recurso.

Sample token exchange POST request to the token endpoint:

POST https://foxids.com/test-corp/-/aspnet_oidc_allup_online_sample(*)/oauth/token HTTP/1.1
Host: foxids.com
Content-Type: application/x-www-form-urlencoded

client_id=some_external_id
&client_secret=goOxwj8Kz...wUC-3CGs
&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&scope=aspnetcore_api2_sample%3Asome_2_access
&subject_token=accVkjcJyb4...UC5PbRDqceLTC
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token

Sample token exchange JSON response:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store

{
    "access_token":"eyJhGcjlc...nNjb3IIWvmDCM",
    "issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
    "token_type":"Bearer",
    "expires_in":600
}

SAML 2.0 para Access Token por trust

Token exchange de token SAML 2.0 externo para JWT access token interno por trust externa.

Neste cenário, uma aplicação SAML 2.0 confia num Identity Provider (IdP) externo e obteve um token SAML 2.0 após a autenticação do utilizador.

Token exchange, SAML 2.0 to Access token by trust

Existe um recurso no ambiente, mas a aplicação SAML 2.0 definida externamente NÃO está autorizada a chamar o recurso diretamente.
Primeiro, é configurado um método de autenticação SAML 2.0 para confiar no Identity Provider (IdP) e o SP issuer é configurado para corresponder à audience da aplicação SAML 2.0 externa.
O exemplo seguinte de trust externa é uma trust para um registo de aplicação SAML 2.0 do FoxIDs.

SAML 2.0 authentication method trust

Depois, é configurado um cliente de registo de aplicação OAuth 2.0 para aceitar tokens SAML 2.0 externos pela trust do método de autenticação. É possível ter uma ou mais trusts de método de autenticação.
O cliente seguinte está configurado com um certificado como credenciais do cliente.

OAuth 2.0 application registration client for SAML 2.0 application

Torna-se assim possível fazer token exchange de um token SAML 2.0 externo para um access token interno válido para o recurso.

Durante a sequência de token exchange, tanto as transformações como as limitações de claims são executadas primeiro no método de autenticação e depois no registo de aplicação.

O backend da aplicação SAML 2.0 faz um pedido de token exchange ao FoxIDs. Autentica o cliente OAuth 2.0 interno e passa o token SAML 2.0 externo enquanto pede (com um scope) um access token para o recurso. Se tiver sucesso, o backend da aplicação SAML 2.0 recebe um access token e pode então chamar o recurso.

Sample token exchange POST request to the token endpoint:

POST https://foxids.com/test-corp/-/aspnet_oidc_allup_online_sample(*)/oauth/token HTTP/1.1
Host: foxids.com
Content-Type: application/x-www-form-urlencoded

client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiI...kyX3NhbXBsZS
&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&scope=aspnetcore_api2_sample%3Asome_2_access
&subject_token=%3Csaml%3AAssertion%20xmlns%3Asaml...%3AAssertion%3E%0A
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Asaml2

Sample token exchange JSON response:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store

{
    "access_token":"eyJhGcRwczov...nNjb3BlIjoi",
    "issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
    "token_type":"Bearer",
    "expires_in":600
}
A sua privacidade

A sua privacidade

Usamos cookies para melhorar a sua experiência nos nossos sites. Clique no botão 'Aceitar todos os cookies' para concordar com a utilização de cookies. Para recusar cookies não essenciais, clique em 'Apenas cookies necessários'.

Visite a nossa página de Política de Privacidade para saber mais