Authentication
Naburis provides a centralized identity provider implementing OpenID Connect (OIDC) for all authentication flows.
Authentication Flow
Section titled “Authentication Flow”Browser Applications
Section titled “Browser Applications”Single-page applications use the Authorization Code flow with PKCE:
The SPA OIDC configuration is available at each product’s /auth/config endpoint:
curl https://ks.naburis.cloud/auth/config# {"issuer":"https://auth.naburis.cloud","clientId":"...","projectId":"..."}Machine-to-Machine
Section titled “Machine-to-Machine”For server-side integration:
- Client Credentials grant — for automated service-to-service communication
- Personal Access Tokens (PATs) — for admin scripts and CI/CD pipelines
JWT Structure
Section titled “JWT Structure”Every access token is a signed JWT (RS256) verified independently by each product via OIDC JWKS discovery. No shared session state exists between services.
Standard Claims
Section titled “Standard Claims”| Claim | Description |
|---|---|
sub | User ID |
iss | Issuer URL |
aud | Project ID |
exp | Token expiration |
urn:zitadel:iam:org:id | Organization (tenant) ID |
urn:zitadel:iam:org:project:roles | Project role grants |
Naburis Platform Claims
Section titled “Naburis Platform Claims”These claims are injected automatically via a pre-access-token webhook and carry your tenant, plan, and entitlement context:
| Claim | Type | Description |
|---|---|---|
| Customer ID | string | Your customer identifier |
| Plan | string | Overall subscription plan |
| Products | string[] | Active product memberships |
| Product plans | object | Product → plan tier mapping |
These claims drive authorization, metering, and rate limiting across all products.
Scope Enforcement
Section titled “Scope Enforcement”Every authenticated request goes through a two-layer authorization check:
- JWT Verification — Verifies the token signature via OIDC JWKS
- Scope Enforcement — Ensures the
X-Tenant-IDandX-Workspace-IDheaders match the JWT claims
If the tenant ID in the header doesn’t match the org ID in the token, the request is denied.