Consume internal API on behalf of an employee ¶
This how-to guides you through the steps required to consume an API secured with Entra ID on behalf of an employee. This is also known as the on-behalf-of (OBO) flow.
Prerequisites ¶
- Your application receives requests with an employee subject token in the
Authorizationheader. Your application is either: - The API you're consuming has granted access to your application and employees
Configure your application ¶
Enable Entra ID in your application:
spec:
azure:
application:
enabled: trueDepending on how you communicate with the API you're consuming, configure the appropriate outbound access policies:
spec:
accessPolicy:
outbound:
rules:
- application: <some-api>
namespace: <some-team>spec:
accessPolicy:
outbound:
external:
- host: <some-host> Exchange token ¶
Now you can exchange the employee's subject token for a new token, targeting the API that you want to consume.
Send a HTTP POST request to the endpoint found in the NAIS_TOKEN_EXCHANGE_ENDPOINT environment variable.
The request must have a Content-Type header set to either:
application/jsonorapplication/x-www-form-urlencoded
The body of the request should contain the following parameters:
| Parameter | Example Value | Description |
|---|---|---|
identity_provider | entra_id | Always entra_id. |
target | <environment>:<team>:<other-api-app-name> | The intended audience (target API or recipient) of the new token. Use the environment, team and application name of the target API. The legacy format api://<environment>.<team>.<other-api-app-name>/.default is also accepted. |
user_token | eyJra... | The user's access token from the inbound request. Token that should be exchanged. |
POST ${NAIS_TOKEN_EXCHANGE_ENDPOINT} HTTP/1.1
Content-Type: application/json
{
"identity_provider": "entra_id",
"target": "<environment>:<team>:<other-api-app-name>",
"user_token": "eyJra..."
}POST ${NAIS_TOKEN_EXCHANGE_ENDPOINT} HTTP/1.1
Content-Type: application/x-www-form-urlencoded
identity_provider=entra_id&
target=<environment>:<team>:<other-api-app-name>&
user_token=eyJra...{
"access_token": "eyJra...",
"expires_in": 3599,
"token_type": "Bearer"
}Your application does not need to validate this token.
Consume API ¶
Once you have acquired a new token, you can finally consume the target API by using the token as a Bearer token:
GET /resource HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJraWQ...Related pages ¶
📚 Entra ID reference