Summary
auth0-deploy-cli can export an enterprise connection client_secret as a generated placeholder like ##CONNECTIONS_OIDC_SECRET##, and then later re-import that same placeholder as the literal live secret value on the tenant.
That breaks enterprise logins with invalid_client and makes a normal export/import round-trip unsafe for Auth0 connections that use client_secret.
Versions
- Older working workflow on this machine:
a0deploy 8.7.1
- Reproduced broken behavior with:
auth0-deploy-cli 8.29.3
Expected behavior
If Deploy CLI generates a masked placeholder on export, import should not write that placeholder back into the live tenant as the actual client_secret value.
Import should do one of these instead:
- strip that field from the update payload
- fail fast with a validation error
- or otherwise treat the generated placeholder as non-deployable
Actual behavior
Import writes the generated placeholder string back into the live Auth0 enterprise connection secret field.
Example resulting live value after import:
"client_secret": "##CONNECTIONS_OIDC_SECRET##"
After that, upstream IdP auth fails with:
invalid_request: server responded with an error in the response body: The client secret supplied for a confidential client is invalid. (invalid_client)
Reproduction
- Use a tenant with an enterprise OIDC connection that has a valid working
client_secret.
- Export the tenant with a newer Deploy CLI version that masks connection secrets.
- Confirm the exported connection file contains a generated placeholder, for example:
"client_secret": "##CONNECTIONS_OIDC_SECRET##"
- Re-import that exported directory without providing a replacement environment variable for that placeholder.
- Observe that the import updates the connection successfully.
- Inspect the live Auth0 connection via the Management API.
- Observe that the live
client_secret is now the literal placeholder string.
- Attempt login through that enterprise connection and observe
invalid_client.
Concrete repro observed
We verified this against a live enterprise OIDC connection:
- The live Auth0 connection had a real secret value before import.
- An import was run using config exported from the same tenant.
- The import explicitly updated that OIDC connection during the connections phase.
- Immediately after import, the live connection value became:
"client_secret": "##CONNECTIONS_OIDC_SECRET##"
- Login failed again with
invalid_client.
Additional context
This seems related to the connection secret masking change introduced in the 8.9.0 release / PR #1103.
From local package inspection:
- older
8.7.1 workflow did not expose this behavior for us
- newer versions export masked connection placeholders
- import-side handling appears to strip only Auth0's
_VALUE_NOT_SHOWN_ sentinel, not generated ##...## placeholders
That makes the export/import contract for connection secrets unsafe.
Suggested fix
When importing connections, generated masked placeholder values like ##CONNECTIONS_*_SECRET## should never be written into live client_secret fields.
Links
Summary
auth0-deploy-clican export an enterprise connectionclient_secretas a generated placeholder like##CONNECTIONS_OIDC_SECRET##, and then later re-import that same placeholder as the literal live secret value on the tenant.That breaks enterprise logins with
invalid_clientand makes a normal export/import round-trip unsafe for Auth0 connections that useclient_secret.Versions
a0deploy 8.7.1auth0-deploy-cli 8.29.3Expected behavior
If Deploy CLI generates a masked placeholder on export, import should not write that placeholder back into the live tenant as the actual
client_secretvalue.Import should do one of these instead:
Actual behavior
Import writes the generated placeholder string back into the live Auth0 enterprise connection secret field.
Example resulting live value after import:
After that, upstream IdP auth fails with:
Reproduction
client_secret.client_secretis now the literal placeholder string.invalid_client.Concrete repro observed
We verified this against a live enterprise OIDC connection:
invalid_client.Additional context
This seems related to the connection secret masking change introduced in the
8.9.0release / PR #1103.From local package inspection:
8.7.1workflow did not expose this behavior for us_VALUE_NOT_SHOWN_sentinel, not generated##...##placeholdersThat makes the export/import contract for connection secrets unsafe.
Suggested fix
When importing
connections, generated masked placeholder values like##CONNECTIONS_*_SECRET##should never be written into liveclient_secretfields.Links