We are trying to combine Okta Native SSO (device_sso) with Native-to-Web SSO (interclient_access) in an Identity Engine mobile application.
Use case
Our mobile app performs native Okta authentication with:
openid profile email offline_access device_sso
We must retain device_sso for the app’s existing native SSO functionality.
After login, the mobile app needs to SSO into a trusted target OIDC web application. That target is integrated with Genesys Cloud, and we need the resulting authorization code to start an authenticated Messenger chat.
The mobile app does not have an Okta browser-session cookie, so we followed the Native-to-Web SSO documentation:
What works
If the original mobile login requests:
openid interclient_access
we can:
-
Obtain the access-token and ID-token pair.
-
Exchange them for a single-use
interclient_token. -
Pass that token to the target app’s authorization request.
-
Receive the expected authorization code.
This confirms that the origin-to-target trust mapping, application assignments and target authorization flow are working.
However, we cannot use this approach because we cannot remove device_sso, and device_sso and interclient_access cannot be requested together during our original login.
What we tried
We authenticate normally with:
openid profile email offline_access device_sso
We then use the returned device_secret and original ID token in a Token Exchange request, requesting:
openid interclient_access
Okta returns a fresh access-token and ID-token pair successfully.
We verified that:
-
The access token contains
openidandinterclient_access. -
The access-token
cidmatches the ID-tokenaud. -
Both tokens have the same issuer and issuance time.
-
The ID token’s
at_hashmatches the access token. -
The ID token contains
sidandds_hash.
We then exchange this fresh pair for the single-use interclient_token, using the trusted target app as the audience.
That request fails with:
{
"error": "access_denied",
"error_description": "The requesting client app retrieved from session is different from the audience of the id_token."
}
We reproduced the same result using both the default custom authorization server and a separate custom authorization server.
Token Exchange is enabled on the origin application and authorization-server policy. The user is assigned to both applications, and the origin app is included in the target app’s Native-to-Web allowlist.
Questions
-
Is it supported to obtain a Native-to-Web
interclient_accesstoken pair through adevice_secretToken Exchange after an initialdevice_ssologin? -
If it is supported, is there another parameter or configuration required to create the session expected by the subsequent
interclient_tokenexchange? -
If it is not supported, what is the recommended way to retain
device_ssowhile allowing the authenticated native app to SSO into a trusted target web app without another interactive browser login?
The direct interclient_access test succeeds, so the failure appears specific to obtaining the token pair through the device-secret exchange.
I can provide sanitized request parameters, decoded token payloads and relevant System Log events if needed.