Prerequisites
- Backstage v1.28 or later
- Conduktor Console with delegated JWT authentication configured
- Backstage and Conduktor Console use the same identity provider (IdP)
- The IdP uses OIDC to issue signed JWTs with email and groups claims (e.g. Keycloak, Okta, Auth0, Jumpcloud, etc.)
How auth works
Authentication is split across three components:- Your IdP handles user authentication (login, MFA, credential issuance)
- Backstage handles the interactive login UX and acquires the JWT from the IdP
- Conduktor Console validates the token and handles authorization
401 unauthorized error code.
Configure the Backstage proxy
Add the Conduktor proxy endpoint to your Backstageapp-config.yaml:
/api/proxy/conduktor/* to your Conduktor Console, passing through the Authorization header containing the user’s JWT. The proxy is needed because the Backstage frontend and Conduktor run on different origins, and browser CORS policies would block direct cross-origin requests.
The
dangerously-allow-unauthenticated setting tells the Backstage proxy to skip its own token validation and forward requests as-is, allowing the Authorization header to pass through to Conduktor unchanged. This is safe because Conduktor validates the JWT and enforces permissions on every request. Requests without a valid token are rejected by Conduktor with a 401.Call the Conduktor API from a frontend plugin
In your Backstage frontend plugin, get the user’s access token from the existing sign-in session and call Conduktor through the proxy. TheauthApiRef below is whatever auth provider API ref your Backstage app uses for sign-in (for example, the ref you pass to the SignInPage component). If you use a different IdP, replace it with the corresponding ref (such as microsoftAuthApiRef, oktaAuthApiRef or a custom ref you created with createApiRef).
/docs on your Conduktor deployment.
Optional: add Conduktor API to the Backstage catalog
You can register the Conduktor API spec as a catalog entity so developers can browse the API documentation directly in Backstage. Add this to your catalog:Permissions
No permission logic is needed in Backstage. Conduktor enforces all authorization server-side. When a request arrives with a valid JWT, Conduktor:- Validates the token (signature via JWKS, issuer, expiration)
- Extracts the user’s email from the configured claim
- Maps the groups claim to internal Conduktor groups
- Auto-provisions the user if they don’t exist yet
- Applies RBAC and filters the API response
403.