StellaOps Authority

Authority is the StellaOps OIDC/OAuth2 control plane. It mints the short-lived (default access-token lifetime: 2 minutes), optionally sender-constrained operational tokens (OpToks) that every StellaOps service, CLI, and UI uses to authenticate to one another.

Audience: platform operators configuring identity providers and tenancy, and service/integration authors who need to understand the token, scope, and admin surfaces Authority exposes.

Recent changes

Responsibilities

Source of truth: token issuance filters requested scopes against authority.clients.allowed_scopes (see AuthorizeEndpoint.cs / principal.SetScopes(...)). The authority.permissions table is the RBAC catalog consumed by the Console Admin role editor and is not consulted at JWT issuance time. See StellaOps.Auth.Abstractions/StellaOpsScopes.cs and architecture.md §4.3.

Key components

HTTP surface (verified against source)

OAuth/OIDC endpoints (registered on the OpenIddict server in Program.cs):

PathMethod(s)Purpose
/tokenPOSTToken endpoint (password, client-credentials, authorization-code, refresh grants).
/authorizeGET/POSTAuthorization-code + PKCE endpoint (PKCE required: RequireProofKeyForCodeExchange).
/connect/authorizeGET/POSTConventional OIDC authorization endpoint alias; handled by the same login handler as /authorize.
/connect/assets/img/stella-identity.pngGETAnonymous gateway-safe alias for the embedded interactive-login hero.
/introspectPOSTToken introspection.
/revokePOSTToken revocation.
/jwksGETJWKS — served by the custom AuthorityJwksService handler (OpenIddict passthrough).
/.well-known/openid-configurationGETOIDC discovery (ConfigureAuthorityDiscoveryHandler).

Authority also serves the conventional /connect/token, /connect/introspect, and /connect/revoke aliases through OpenIddict. /connect/authorize is mapped directly in Authority to the custom interactive login shell so browser clients using the Platform-advertised URL do not fall through to the SPA/404 path.

Operational and administrative endpoints (minimal-API routes in the Authority host):

PathMethod(s)Scope (StellaOpsScopes)Notes
/health, /readyGETanonymousLiveness/readiness incl. identity-provider health.
/buildinfo.jsonGETanonymousBuild/version drift signal.
/.well-known/openapiGETanonymousOpenAPI discovery.
/api/v1/authority/revocation/statusGETRevocation bundle status.
/api/v1/tenants/{tenantId}/compliance-profileGETauthority:tenants.readSource-owned nullable compliance profile.
/api/v1/tenants/{tenantId}/assurance-packsGETauthority:tenants.read, policy:read, or policy:auditTenant-enabled assurance packs + readiness reasons; the required tenant header must match the path tenant.
/api/v1/tenants/{tenantId}/submission-authorizationsGETauthority:tenants.readRuntime-safe operator submission authorization.
/console/tenants, /console/profile, /console/token/introspectGET/POSTui.read (+ authority:tenants.read for tenants)Console read surface.
/console/vuln/*, /console/vex/statementsGET/POSTui.read + advisory:read/vex:read/console/vex/events fails closed with 501 vex_events_stream_unsupported.
/console/admin/*, /api/admin/users (legacy alias)variousui.admin group + per-route authority:* scopesTenant/user/role/client/token/audit admin; mutations require RequireFreshAuth() and are Audited(...).
/console/admin/identity-providers/*GET/POST/PUT/DELETEui.admin + `authority:idp.readwrite`
/console/admin/brandingGET/PUT/POSTui.adminBranding read/update/preview.
/internal/*POST/GETbootstrap API key (BootstrapApiKeyFilter)Bootstrap users/clients/invites, service-account inventory/revocations, signing/ack-token rotation, plugin reload — gated by Authority:Bootstrap:Enabled.
/permalinks/vuln, /notify/ack-tokens/*, /vuln/workflow/*, /vuln/attachments/tokens/*, /advisory-ai/remote-inference/logsPOSTtoken-signer surfacesSigned-token issue/verify and consent logging.

The admin audit list endpoint (GET /console/admin/audit) is deprecated (Sunset 2027-10-19) with successor GET /api/v1/audit/events?modules=authority on Timeline. The compatibility proxy preserves the authenticated tenant and decoded filters, and its shared Timeline client authenticates the service hop with a short-lived signed identity envelope carrying only timeline:read. A missing envelope key fails before HTTP; upstream failures return a sealed 502 timeline_audit_unavailable response rather than exposing transport or storage detail.

Scope catalog

Integrations & dependencies

Operational notes

Backlog references

Epic alignment

Implementation Status

Epic milestones:

Key technical decisions:

Risks & mitigations: