You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
global.identity.auth.enabled=true with no resolvable issuer renders an authenticated
release whose issuer values are all empty strings, with no error and no warning. The chart
bundles no Keycloak, so nothing fills them in: global.identity.auth.issuer is empty by
default and camundaPlatform.authIssuerBackendUrl only resolves once global.identity.auth.issuerBackendUrl or global.identity.keycloak.url.host is set.
Every component that reads those helpers is affected — Management Identity, the
Orchestration Cluster, Connectors — so a release can come up "with authentication enabled"
while no component can validate a token.
Expected vs Actual Behavior
Expected: enabling authentication without naming an issuer or an issuer backend URL fails
the render with a message naming the missing key, the way the other templates/common/constraints.tpl checks do.
Derived endpoints inherit the emptiness: with type: KEYCLOAK, camundaPlatform.authIssuerBackendUrlEndpointCerts renders the relative path /protocol/openid-connect/certs, which is not a URL any component can fetch a JWKS from.
Motivation / Use Case
This is a silent misconfiguration that surfaces only at runtime, as token validation
failures across several components at once, with nothing in the rendered manifests
obviously wrong other than a few empty strings. templates/common/constraints.tpl already
fails fast on comparable states (global.topology.mode=orchestration without global.identity.service.url, mode=optimize without a database backend), so the pattern
and the place for the check both exist.
Optimize has since gained a check of its own: PR #6884 fails the render when Optimize
authenticates and neither an issuer nor an issuer backend URL resolves. That check is
deliberately scoped to Optimize, because widening it was out of that PR's scope — five
pre-existing unit test cases in test/unit/common, test/unit/identity and test/unit/optimize enable global auth incidentally, without ever naming an issuer, and
would have needed changing. Generalising the guard means deciding whether to accept that
blast radius chart-wide.
Acceptance Criteria
Decide whether the empty-issuer state should fail the render chart-wide, or only
warn (camundaPlatform.warning), given that it changes rendering for existing
values files that enable global auth before configuring a provider.
Unit tests on both sides of the boundary: rejected with nothing resolvable, accepted
with an External Keycloak that resolves through global.identity.keycloak.url.host
and leaves issuer empty (a supported shape — do not break it).
Update the pre-existing test cases that rely on the current permissiveness.
Decide whether this needs an upgrade note in camunda-docs for anyone whose values
file currently renders and would then fail.
Additional Context
The External Keycloak shape must keep working: global.identity.auth.issuer empty with global.identity.keycloak.url.host set is documented in values.yaml
("External Keycloak: leave empty") and derives every endpoint from the host. So the
condition is "no issuer and no resolvable issuer backend URL", not "no issuer".
Description
global.identity.auth.enabled=truewith no resolvable issuer renders an authenticatedrelease whose issuer values are all empty strings, with no error and no warning. The chart
bundles no Keycloak, so nothing fills them in:
global.identity.auth.issueris empty bydefault and
camundaPlatform.authIssuerBackendUrlonly resolves onceglobal.identity.auth.issuerBackendUrlorglobal.identity.keycloak.url.hostis set.Every component that reads those helpers is affected — Management Identity, the
Orchestration Cluster, Connectors — so a release can come up "with authentication enabled"
while no component can validate a token.
Expected vs Actual Behavior
Expected: enabling authentication without naming an issuer or an issuer backend URL fails
the render with a message naming the missing key, the way the other
templates/common/constraints.tplchecks do.Actual: it renders. On chart 15.x (8.10):
Derived endpoints inherit the emptiness: with
type: KEYCLOAK,camundaPlatform.authIssuerBackendUrlEndpointCertsrenders the relative path/protocol/openid-connect/certs, which is not a URL any component can fetch a JWKS from.Motivation / Use Case
This is a silent misconfiguration that surfaces only at runtime, as token validation
failures across several components at once, with nothing in the rendered manifests
obviously wrong other than a few empty strings.
templates/common/constraints.tplalreadyfails fast on comparable states (
global.topology.mode=orchestrationwithoutglobal.identity.service.url,mode=optimizewithout a database backend), so the patternand the place for the check both exist.
Optimize has since gained a check of its own: PR #6884 fails the render when Optimize
authenticates and neither an issuer nor an issuer backend URL resolves. That check is
deliberately scoped to Optimize, because widening it was out of that PR's scope — five
pre-existing unit test cases in
test/unit/common,test/unit/identityandtest/unit/optimizeenable global auth incidentally, without ever naming an issuer, andwould have needed changing. Generalising the guard means deciding whether to accept that
blast radius chart-wide.
Acceptance Criteria
warn (
camundaPlatform.warning), given that it changes rendering for existingvalues files that enable global auth before configuring a provider.
templates/common/constraints.tpl, gated onglobal.identity.auth.enabledand an unresolvable issuer, replacing theOptimize-only check from feat(8.10): add an optimize release role that owns its OIDC identity #6884 so there is a single rule.
with an External Keycloak that resolves through
global.identity.keycloak.url.hostand leaves
issuerempty (a supported shape — do not break it).camunda-docsfor anyone whose valuesfile currently renders and would then fail.
Additional Context
The External Keycloak shape must keep working:
global.identity.auth.issuerempty withglobal.identity.keycloak.url.hostset is documented invalues.yaml("External Keycloak: leave empty") and derives every endpoint from the host. So the
condition is "no issuer and no resolvable issuer backend URL", not "no issuer".
References
(
templates/common/constraints.tpl,optimize.effectiveAuthIssuer/optimize.effectiveAuthIssuerBackendUrl)templates/common/_helpers.tpl—camundaPlatform.authIssuerBackendUrl,camundaPlatform.authIssuerUrlWithFallback,camundaPlatform.authIssuerBackendUrlEndpointCertsEnvironment
supported versions, so it likely reproduces there too