StellaOps Authority

Verified against commit 942a18727c (2026-09-26, DOC-2 of SPRINT_20260926_001). Re-verify by reading the evidence paths listed in the Evidence section of architecture.md.

Service wiring (image, database and role, compose profile, bundle presence) is generated in the service inventory; this dossier does not restate it.

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

Source: src/Authority/StellaOps.Authority/StellaOps.Authority (deployable authority, alias authority.stella-ops.local). It also hosts the folded issuer-directory surface; the standalone IssuerDirectory host is retired.

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: human token issuance intersects requested scopes, the client ceiling, and compiled role grants through AuthorityHumanScopeResolver. The authority.permissions table is the RBAC catalog consumed by the Console Admin role editor and is not consulted at JWT issuance time. See human scope issuance, 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).
/logoutGET/POSTOIDC RP-Initiated Logout (end-session).
/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, /connect/revoke, /connect/revocation and /connect/logout forms. The legacy /oauth/token, /oauth/introspect and /oauth/revoke aliases were removed on 2026-09-27 (PCD-78); Authority no longer rewrites or serves them. /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.
Build-info endpoint (/buildinfo.json)GETanonymousBuild/version drift signal.
/.well-known/openapiGETanonymousCurated OAuth contract; a generated OpenAPI document is also served.
Doctor checks (MapServiceDoctorEndpoints)GET/POSTops.healthEstate doctor contract for this host.
/api/v1/authority/revocation/statusGETauthority.revocation.readRevocation bundle status.
/api/v1/claims/overridesGETauthority:claims-overrides.read (policy authority.claims-overrides.read; granted only to stellaops-gateway-claims)Authority-managed endpoint claim overrides for the router gateway (Authority:Router:ClaimsOverrides).
/authority/audit/incident, /authority/audit/airgapGET/POSTobs:read; airgap:status:read (read) / airgap:import (write)Incident and air-gap audit groups.
/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/*variousui.admin group + per-route authority:* scopesTenant/user/role/client/token/audit admin; mutations require RequireFreshAuth() and are Audited(...). There is no /api/admin/* alias.
/console/admin/identity-providers/*GET/POST/PUT/DELETEui.admin + authority:idp.read / authority:idp.writeProcess-global provider CRUD/apply/status/preflight; global-admin only, no tenant header, fresh authentication for writes.
/console/admin/brandingGET/PUT/POSTui.admin + authority:branding.read / authority:branding.writeBranding read/update/preview.
/console/brandingGETnone declared (public)Tenant branding for the sign-in surface.
/internal/*POST/GETbootstrap API key (BootstrapApiKeyFilter)Bootstrap users/clients/invites, revocation export, service-account inventory/revocations, signing/ack-token rotation, plugin reload — gated by Authority:Bootstrap:Enabled (the release bundle defaults it to false).
/internal/plugins/statusGETops.health (policy authority.ops.health)Plugin runtime status; mapped regardless of the bootstrap switch.
/internal/plugins/probePOSTops.adminRuns every loaded plugin’s deterministic health check; mapped regardless of the bootstrap switch.
/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

Evidence

The claims in this README are backed by the Evidence table in architecture.md. Additional README-specific sources:

ClaimSource
Access-token lifetime default and bundle overridesrc/__Libraries/StellaOps.Configuration/StellaOpsAuthorityOptions.Core.cs, devops/release/bundle/docker-compose.yml (STELLAOPS_AUTHORITY_AUTHORITY__ACCESSTOKENLIFETIME)
Telemetry namessrc/Authority/StellaOps.Authority/StellaOps.Auth.Abstractions/AuthorityTelemetry.cs, src/Authority/StellaOps.Authority/StellaOps.Authority/AuthorityTelemetryConfiguration.cs
DAY-2 public-origin expansionsrc/Authority/StellaOps.Authority/StellaOps.Authority.Plugin.Standard/StandardPluginOptions.cs, devops/etc/authority/plugins/standard.yaml, devops/release/bundle/tools/generate-bundle.py
BGI-1 introspection consumersrc/Router/StellaOps.Gateway.WebService/Middleware/BreakGlassIntrospectionMiddleware.cs, src/Router/StellaOps.Gateway.WebService/Services/GatewayBreakGlassIntrospectionIdentityCheck.cs
DEF-10 seed pinssrc/Authority/StellaOps.Authority/StellaOps.Authority.Plugin.Standard.Tests/StandardPluginOptionsTests.cs, devops/etc/authority.plugins/standard.yaml