Describe the Bug
While working with the new control-plane server on the official sandbox, I noticed that the Identity API (/api/v1/identity/*) cannot work there.
The sandbox now uses Keycloak through the generic defaultIdp OIDC configuration, and kubauth is not installed on it. Authentication works fine for the different services because they only rely on standard OIDC.
The Identity API is different: its implementation is built directly on top of the kubauth CRDs (User, Group and GroupBinding), and even the IdentityRepository interface exposes these CRD types in its public methods (CreateUser(ctx, *crd.User), etc.). Since those CRDs do not exist on the sandbox cluster, every Identity endpoint returns a 500.
Steps to Reproduce
- Deploy the official sandbox (
OKDP/okdp-sandbox, clusters/sandbox/) ; Keycloak is the identity provider, kubauth is not installed.
- Run the control-plane server against that cluster.
- Call any Identity endpoint, e.g.:
curl http://localhost:8093/api/v1/identity/users
- Optionally confirm the CRDs are absent:
kubectl get crd | grep kubauth → no results.
Expected Behavior
The Identity API should either work against the configured identity provider (the sandbox uses Keycloak), or not be exposed when it cannot be supported.
Actual Behavior
All /api/v1/identity/* endpoints return 500: the server tries to read/write kubauth.kubotal.io/v1alpha1 CRDs that do not exist on the cluster.
Environment
Kubernetes version
Details
$ kubectl version
Client Version: v1.36.2
Kustomize Version: v5.8.1
Server Version: v1.34.0
Warning: version difference between client (1.36) and server (1.34) exceeds the supported minor version skew of +/-1
Helm version
Details
$ helm version
version.BuildInfo{Version:"v4.2.2", GitCommit:"b05881cf967a5a09e19866799d0edfd40675803a", GitTreeState:"clean", GoVersion:"go1.26.4", KubeClientVersion:"v1.36"}
Chart / component version:
Cluster setup (Kind version, node count, any custom config):
kind version
kind v0.30.0 go1.24.6 linux/amd64
Logs
Client side:
$ curl -i http://localhost:8093/api/v1/identity/users
HTTP/1.1 500 Internal Server Error
{"error":"the server could not find the requested resource"}
$ curl -i http://localhost:8093/api/v1/identity/groups
HTTP/1.1 500 Internal Server Error
{"error":"the server could not find the requested resource"}
$ kubectl get crd | grep kubauth
(no results)
Server side:
time="2026-07-15T09:09:31Z" level=error msg="Failed to list users" error="the server could not find the requested resource"
time="2026-07-15T09:09:31Z" level=error msg="Internal Server Error" duration=11.92726ms ip="::1" latency=11.92726ms method=GET path=/api/v1/identity/users status=500
time="2026-07-15T09:09:31Z" level=error msg="Failed to list groups" error="the server could not find the requested resource"
time="2026-07-15T09:09:31Z" level=error msg="Internal Server Error" duration=1.578151ms ip="::1" latency=1.578151ms method=GET path=/api/v1/identity/groups status=500
Anything else we need to know?
This made me wonder whether this feature still belongs in the core server, so this issue is as much a design question as a bug report.
From what I understand, in most production environments users and groups already come from an existing corporate identity provider (Entra ID, LDAP/AD, Okta, Keycloak, ...). The platform authenticates against that provider, but it usually does not own the lifecycle of human identities. The sandbox follows the same approach: users, roles and clients are seeded declaratively through the Keycloak configuration.
Possible directions:
- Make the Identity API provider-neutral (an abstraction with one adapter per identity provider).
- Keep user and group management outside the core server, and let administrators manage identities directly in their identity provider (or declaratively for kubauth/Keycloak).
- Keep the current API, but clearly define it as a kubauth-specific feature rather than part of the provider-neutral core.
For me the first question is simply: should managing human users and groups be a responsibility of the OKDP control-plane at all? Agreeing on that point first will make it much easier to decide what should happen to the current implementation.
Describe the Bug
While working with the new control-plane server on the official sandbox, I noticed that the Identity API (
/api/v1/identity/*) cannot work there.The sandbox now uses Keycloak through the generic
defaultIdpOIDC configuration, and kubauth is not installed on it. Authentication works fine for the different services because they only rely on standard OIDC.The Identity API is different: its implementation is built directly on top of the kubauth CRDs (
User,GroupandGroupBinding), and even theIdentityRepositoryinterface exposes these CRD types in its public methods (CreateUser(ctx, *crd.User), etc.). Since those CRDs do not exist on the sandbox cluster, every Identity endpoint returns a 500.Steps to Reproduce
OKDP/okdp-sandbox,clusters/sandbox/) ; Keycloak is the identity provider, kubauth is not installed.curl http://localhost:8093/api/v1/identity/userskubectl get crd | grep kubauth→ no results.Expected Behavior
The Identity API should either work against the configured identity provider (the sandbox uses Keycloak), or not be exposed when it cannot be supported.
Actual Behavior
All
/api/v1/identity/*endpoints return 500: the server tries to read/writekubauth.kubotal.io/v1alpha1CRDs that do not exist on the cluster.Environment
Kubernetes version
Details
Helm version
Details
Chart / component version:
Cluster setup (Kind version, node count, any custom config):
kind version
kind v0.30.0 go1.24.6 linux/amd64
Logs
Client side: $ curl -i http://localhost:8093/api/v1/identity/users HTTP/1.1 500 Internal Server Error {"error":"the server could not find the requested resource"} $ curl -i http://localhost:8093/api/v1/identity/groups HTTP/1.1 500 Internal Server Error {"error":"the server could not find the requested resource"} $ kubectl get crd | grep kubauth (no results) Server side: time="2026-07-15T09:09:31Z" level=error msg="Failed to list users" error="the server could not find the requested resource" time="2026-07-15T09:09:31Z" level=error msg="Internal Server Error" duration=11.92726ms ip="::1" latency=11.92726ms method=GET path=/api/v1/identity/users status=500 time="2026-07-15T09:09:31Z" level=error msg="Failed to list groups" error="the server could not find the requested resource" time="2026-07-15T09:09:31Z" level=error msg="Internal Server Error" duration=1.578151ms ip="::1" latency=1.578151ms method=GET path=/api/v1/identity/groups status=500Anything else we need to know?
This made me wonder whether this feature still belongs in the core server, so this issue is as much a design question as a bug report.
From what I understand, in most production environments users and groups already come from an existing corporate identity provider (Entra ID, LDAP/AD, Okta, Keycloak, ...). The platform authenticates against that provider, but it usually does not own the lifecycle of human identities. The sandbox follows the same approach: users, roles and clients are seeded declaratively through the Keycloak configuration.
Possible directions:
For me the first question is simply: should managing human users and groups be a responsibility of the OKDP control-plane at all? Agreeing on that point first will make it much easier to decide what should happen to the current implementation.