Legacy Authority Authentication Endpoints — Deprecation Guidance

Announced: 1 November 2025
Sunset (removal no earlier than): 1 May 2026

This guide tells operators and integrators how to migrate off the deprecated /oauth/* authentication aliases in StellaOps Authority before they are retired, and documents the deprecation headers, configuration, and audit signals emitted in the meantime.

Summary

StellaOps Authority previously exposed OAuth 2.1 endpoints at /oauth/token, /oauth/revoke, and /oauth/introspect to ease migration from early previews. Those aliases are now deprecated in favour of the canonical paths (/token, /revoke, /introspect). All responses from the legacy routes include:

No new features (DPoP nonces, audit upgrades, policy scopes) will ship on the legacy routes.

Implementation note (verified against src/Authority). The legacy routes are served by LegacyAuthDeprecationMiddleware, which transparently rewrites /oauth/token, /oauth/introspect, and /oauth/revoke to the canonical /token, /introspect, and /revoke paths and forwards the request to the same OpenIddict handlers (canonical endpoints are registered in Program.cs via SetTokenEndpointUris("/token") / SetIntrospectionEndpointUris("/introspect") / SetRevocationEndpointUris("/revoke")). The middleware does not currently contain any date-based logic, so the aliases do not automatically begin returning 410 Gone on the sunset date. The shim is controlled entirely by the apiLifecycle.legacyAuth.enabled configuration flag (default true); operators turn the shim off — or a future release removes the middleware — to retire the aliases. When the shim is disabled the rewrite no longer applies and requests to /oauth/* fall through to standard routing (today there is no canonical handler bound at /oauth/*, so they return 404). The 410 Gone behaviour described below is the planned retirement contract, not the current runtime behaviour.

Required Actions

Configuration

The shim is configured under apiLifecycle.legacyAuth in the Authority configuration (e.g. authority.yaml; see etc/authority.yaml.sample). The settings are bound to AuthorityLegacyAuthEndpointOptions and validated on startup.

KeyTypeDefaultNotes
apiLifecycle.legacyAuth.enabledbooltrueMaster switch for the shim. When false, no rewrite or deprecation headers are emitted and /oauth/* requests fall through to normal routing.
apiLifecycle.legacyAuth.deprecationDatedate-time2025-11-01T00:00:00ZEmitted in the Deprecation header (RFC 1123 format) and the legacy.deprecation_at audit property.
apiLifecycle.legacyAuth.sunsetDatedate-time2026-05-01T00:00:00ZEmitted in the Sunset header and Warning/legacy.sunset_at. Validation requires sunsetDate to be strictly after deprecationDate.
apiLifecycle.legacyAuth.documentationUrlstring (http/https URL)https://docs.stella-ops.org/authority/legacy-authWhen set, emitted as the Link; rel="sunset" header. Validated to be an absolute http/https URI; set to empty to suppress the Link header.

The notificationTopic key shown in some configuration samples is not bound by AuthorityLegacyAuthEndpointOptions and has no runtime effect; it is illustrative only.

Audit event details

When the shim handles a legacy request it writes one authority.api.legacy_endpoint audit event (AuthEventRecord) via the audit sink, with Outcome = Success. The event carries these properties for dashboards and alerting:

PropertyValue
legacy.endpoint.originalThe legacy path that was called (e.g. /oauth/token).
legacy.endpoint.canonicalThe canonical path the request was rewritten to (e.g. /token).
legacy.deprecation_atConfigured deprecation date (ISO-8601).
legacy.sunset_atConfigured sunset date (ISO-8601).
http.status_codeThe downstream HTTP status code returned to the caller.

The event also records correlation id (current trace id) and best-effort network details (remote address, X-Forwarded-For, user agent), all classified as personal data.

Timeline & Support

DateMilestone
1 Nov 2025Deprecation headers emitted, documentation published
Jan–Apr 2026Observability dashboards highlight remaining usage; support assists with migrations
1 May 2026Earliest planned retirement. Note: retirement is not automatic on this date — an operator setting apiLifecycle.legacyAuth.enabled: false, or a release that removes LegacyAuthDeprecationMiddleware, is what retires the aliases. The intended end-state contract is 410 Gone (or 404 if the routes are simply unregistered), after which they will be removed in the next major release.

Questions? Contact the Authority Core guild or open a ticket with the API Governance Guild referencing AUTH-OAS-63-001.