The Future of Authentication
This page synthesizes source-level implementation analysis of OpenAM/OpenID, current research on AI-driven attacks, RFC-track developments in agent identity, NIST post-quantum standards (FIPS 203/204/205), and deployment telemetry from the major passkey rollouts. The goal: a single, evidence-grounded map of where authentication is, what breaks it, and where it is going—concretely, not speculatively.
Five Key Findings
-
Origin binding is the only structural phishing defense we have. OAuth2 redirect URIs and WebAuthn/passkey origin binding are structurally unphishable—an AI phishing agent cannot steal the credential because the secret never crosses the attack surface. Everything else (passwords, TOTP codes, push approvals) can be captured by an adversarial LLM acting as a real-time relay.
-
Voice and face are dead as out-of-band verification. The $25.6M Arup deepfake loss (January 2024) is the threshold event. Biometric OOB verification requires hardware root of trust (TPM attestation, device binding) to be meaningful.
-
AI agents need machine identity infrastructure, not just tokens. SPIFFE/SPIRE (CNCF graduated) solves workload identity. MCP’s OAuth 2.1 + RFC 9728 solves discovery. The remaining gap—one-hop delegation enforcement for multi-agent pipelines—is the active work in draft-ietf-oauth-transaction-tokens.
-
RSA-2048 is closer to broken than the 2022 NIST guidance implied. Gidney’s May 2025 revision puts the qubit requirement at under 1 million for RSA-2048 (down 20× from his 2019 estimate). NIST’s CNSA 2.0 response: mandatory post-quantum by 2031 for new systems, 2035 for all systems. Hybrid TLS (X25519MLKEM768) is already the default in Chrome 131+ and Cloudflare edge.
-
JWT is structurally sound; the implementation details are where the risk lives. The OpenAM source code reveals exactly which properties are enforced (PKCE S256 via constant-time compare, realm isolation) and which are not (nonce validation on return, DPoP binding during token use,
plainPKCE still accepted). Modern stacks must enforce what OpenAM documented but did not close.
Part 1 — How OAuth2/OIDC/JWT Actually Works
The Authorization Code Flow at Class Level
OpenAM’s OAuth2 implementation provides a precise reference for how the standard is translated into production code. The entry points are AuthorizeResource (the /oauth2/authorize endpoint) and TokenEndpointResource (the /oauth2/access_token endpoint), both in the org.forgerock.oauth2.restlet package.
The 20-Claim Access Token
StatelessTokenStore.createAccessToken() constructs every access token with exactly these claims, assembled from three sources: the OAuth2 request, the SSOToken session, and the server configuration:
| Claim | Source | Notes |
|---|---|---|
jti | Random UUID | Unique token identifier |
iss | Server config | Realm-qualified issuer URL |
sub | SSOToken principal | Pairwise or public depending on client config |
aud | client_id | Single-element array |
exp | iat + expires_in | Configurable per client |
iat | System clock | Issue time |
nbf | iat | Not-before == issue time |
auth_time | AUTH_INSTANT from SSO | When the user actually authenticated |
nonce | Request param | Stored; not re-validated on return — see security gap below |
scope | Granted scope set | Space-separated string |
realm | OpenAM realm | Non-standard; realm-scoped policy enforcement |
realm_access.roles | SSO group membership | Keycloak-compatible non-standard extension |
claims | Custom claims service | Pluggable via org.forgerock.oauth2.claims SPI |
token_name | "access_token" | OpenAM internal |
oauth_token_type | "Bearer" or "DPoP" | |
typ | "at+JWT" (RFC 9068) | |
expires_in | Config | Mirrored into body for client convenience |
audit_tracking_id | UUID | Links to OpenAM audit log entry |
auth_grant_id | Authorization code ID | Back-links to the original grant |
cnf | DPoP public key thumbprint | Present if DPoP was used in /authorize — stored but not enforced in token use |
PKCE: The One Thing OpenAM Got Right
AuthorizationCodeGrantTypeHandler performs the S256 code challenge verification using java.security.MessageDigest.isEqual() — the constant-time comparison that prevents timing attacks. The implementation is correct:
byte[] challenge = Base64url.decode(code.getCodeChallenge());byte[] computed = Base64.getUrlEncoder().withoutPadding() .encode(MessageDigest.getInstance("SHA-256") .digest(verifier.getBytes(StandardCharsets.US_ASCII)));if (!MessageDigest.isEqual(challenge, computed)) { throw new InvalidGrantException("PKCE verification failed");}Five Security Gaps in the OpenAM Implementation
These are not theoretical—they are verifiable by reading the source:
Gap 1: Nonce not validated on return. The nonce is stored in the authorization code object and copied into the JWT, but StatelessTokenStore never checks that the nonce the client presents at the token endpoint matches what was stored. The OpenID Connect Core spec (§3.1.3.7) requires this check for ID tokens; OpenAM skips it.
Gap 2: plain PKCE still accepted. AuthorizationCodeGrantTypeHandler accepts code_challenge_method=plain alongside S256. plain PKCE provides no security benefit against code interception—the verifier equals the challenge. OAuth 2.1 (draft-15) removes plain entirely.
Gap 3: DPoP binding stored but not enforced during token use. When a client sends a DPoP proof at the /authorize endpoint, the public key thumbprint is stored in the cnf claim. The resource server policy should reject any request that presents the access token without a matching DPoP proof. OpenAM’s policy agent (OpenIG) does not enforce the cnf binding unless explicitly configured—and the default configuration does not enable DPoP verification.
Gap 4: synchronized(code.intern()) fragile under horizontal scale. The replay protection for the authorization code uses Java’s string intern pool as a lock. String interning is JVM-local—this lock does not work across multiple OpenAM nodes behind a load balancer without sticky sessions. A replay attack is possible if the authorization code redemption is routed to a different node before the first node’s setIssued(true) propagates to the shared token store.
Gap 5: realm_access.roles is a non-standard extension. OpenAM copied Keycloak’s claim naming convention for role data, but this is not part of any OIDC specification. Applications built against this claim are depending on OpenAM/Keycloak-specific behavior that will break on migration to any other IdP.
Part 2 — What AI Breaks in Current Authentication
The Attack Surface Map
Adversarial Relay: The AI Phishing Problem
A real-time adversarial relay sits between the user and the legitimate IdP, proxying the entire authentication flow while harvesting credentials and session tokens. This attack predates AI—EvilginX and Modlishka have operated this way since 2018. What AI adds is:
- Conversational convincing. The attacker need not craft a static phishing page. An LLM can engage the target in a plausible pre-text conversation that leads to clicking a link.
- Adaptive real-time response. When the target hesitates, the LLM adapts. Static pages cannot.
- At-scale personalization. Spear-phishing economics collapse when LLM drafting costs approach zero.
What breaks: Passwords, TOTP codes, push approvals, and OTP SMS are all captured by the relay—the user types them into the fake site, and the relay forwards them to the real IdP in real time. The attacker gets the session cookie.
What holds: WebAuthn/passkey credentials and PKCE redirect URIs are origin-bound. The passkey private key signs a challenge that includes the origin (https://accounts.google.com). If the user lands on https://accounts.g00gle.com, the origin is different, the authenticator refuses, and the attacker gets nothing. No code path exists to extract the credential through a relay. This is structural, not heuristic.
The Deepfake OOB Collapse
The Arup loss in January 2024—$25.6M wired after a video call with deepfake representations of the CFO and other executives—established the practical threshold for deepfake social engineering at enterprise scale. The attack did not require any technical compromise of the auth stack. It used AI-generated video and voice to deceive a human employee who had the authority to initiate the wire.
The implication for auth design: Any authentication factor that depends on a human recognizing a known person’s voice or face is now unreliable. This eliminates:
- Voice-based OOB verification (“call your relationship manager to confirm”)
- Video-based identity verification without liveness attestation
- Push notifications approved by a human who has been socially pre-conditioned
What works: Device-bound attestation. If the approval comes from a hardware security key or a platform authenticator with TPM-backed keys, the attacker cannot generate a deepfake of the hardware. The device is present and attests. The human in the loop is removed from the security-critical path.
AI-Accelerated Credential Stuffing
Credential stuffing (testing breach-exposed credentials against live services) has always been a volume game. AI improves it in two ways:
- CAPTCHA solving at scale. Vision-language models solve text and image CAPTCHAs with accuracy competitive with humans, at near-zero marginal cost per challenge.
- Behavioral mimicry. Stuffing detection relies on anomaly signals: request rate, mouse movement, typing cadence. AI agents can be instructed to mimic human behavioral patterns from training data.
The defense: Passkeys eliminate the password entirely. No credential to stuff. Rate limiting with CAPTCHA remains a degraded second line for systems that still use passwords.
Prompt Injection as Confused Deputy
The confused deputy problem (Lampson, 1973) is: a program with legitimate authority is tricked into misusing that authority on behalf of an attacker who does not have it. OWASP LLM Top 10 (2025) names this LLM01: Prompt Injection.
When an AI agent has OAuth2 tokens and acts on natural language instructions, injected instructions in retrieved content (web pages, documents, email) can redirect the agent’s authorized actions. The agent is the deputy. The injector is the attacker. The agent’s token grants are the misused authority.
The mitigations: Token scoping (the agent’s token should only permit read, not write, for email summarization), Transaction Tokens (each action requires a fresh token with the specific action in the txn claim), and output validation (the agent’s actions are checked against the original user intent before execution). None of these are fully standardized yet.
Part 3 — AI as a First-Class Identity Principal
The Machine Identity Stack Today
Before addressing AI agents specifically, the current state of machine identity is important context. SPIFFE/SPIRE (CNCF graduated, 2022) provides the foundation: every workload gets a SPIFFE ID (spiffe://trust-domain/path/to/workload) backed by a short-lived X.509 SVID or JWT-SVID. The SPIRE agent rotates credentials automatically; the workload never handles long-lived secrets.
MCP’s Authorization Model
The Model Context Protocol specification (2025) mandates OAuth 2.1 with PKCE for all MCP server authorization. RFC 9728 (OAuth Protected Resource Metadata, April 2025) provides the discovery mechanism: the MCP server publishes its authorization server location at /.well-known/oauth-protected-resource, and the client fetches the authorization server’s metadata at /.well-known/oauth-authorization-server to discover endpoints.
This solves the “which IdP do I talk to?” bootstrap problem for AI agents autonomously discovering and connecting to services.
The Multi-Agent Delegation Gap
The missing piece is what happens when one AI agent calls another. Current OAuth2 flows handle one level of delegation (user → agent). Multi-agent pipelines need N-level delegation that preserves the original authorization context all the way down the chain.
draft-ietf-oauth-transaction-tokens-08 addresses this with a new token type: the Transaction Token (txn_token). Key properties:
- Contains the original subject (the human who initiated the overall transaction)
- Immutable once issued—the token cannot be modified as it traverses the call chain
- Contains an
azd(authorization details) claim describing the specific action being performed - Issued by a Transaction Token Service (TTS) with a short TTL (single-transaction lifetime)
- Designed for one-hop delegation only: each service in the chain requests a new txn_token from the TTS, chaining to the previous one via the
rctx(request context) claim
The protocol is still in draft as of May 2026. The gap between current OAuth2 and a fully deployed multi-agent trust model is approximately 18–24 months of standardization plus 12–18 months of implementation.
The Confused Deputy Mitigations
| Mitigation | How It Works | Status |
|---|---|---|
| Minimum-scope tokens | Agent receives only the scopes needed for declared task | Deployable now via AS policy |
| Token-per-action | New token requested for each distinct action in the pipeline | Supported now; performance cost |
| Transaction Tokens | Immutable context chain, one-hop delegation, action in azd | Draft; ~2027 deployable |
| Intent verification | Agent declares intended actions before execution; system validates | Not standardized; research stage |
| Output sandboxing | Retrieved content processed in isolated context before affecting agent state | Application-layer; no standard |
Part 4 — Post-Quantum Migration
What Quantum Computers Break
The September 2023 NIST PQC standards assumed a large-scale quantum computer was roughly a decade away. Gidney’s May 2025 paper (arXiv:2505.15917) revised the resource estimate for breaking RSA-2048 from approximately 20 million qubits (2019 estimate) to under 1 million qubits—a 20× reduction in required hardware. This does not mean the attack is imminent; it means the safety margin is smaller than assumed, and the 2030–2035 window for mandatory migration is the correct urgency frame.
What breaks with a cryptographically relevant quantum computer (CRQC):
- RSA-2048, RSA-4096 (Shor’s algorithm, factoring)
- ECDSA, ECDH over P-256, P-384, P-521 (Shor’s algorithm, discrete log)
- X25519 (Shor’s algorithm, discrete log)
- HMAC-SHA256 (Grover’s algorithm, 2× speedup — weakened but not broken; SHA-256 output remains 128-bit post-quantum)
What does not break:
- AES-256 (Grover gives 2× speedup; 256-bit key → 128-bit post-quantum security — retain AES-256, drop AES-128)
- SHA-3 / SHA-256 (Grover; similar analysis)
- The JWT signature algorithm is the attack surface, not the token format itself
The NIST Post-Quantum Stack
NIST published three final standards in August 2024:
| Standard | Algorithm | Purpose | Key Sizes |
|---|---|---|---|
| FIPS 203 | ML-KEM (Kyber) | Key encapsulation | ML-KEM-768: 1,184B public key, 2,400B ciphertext |
| FIPS 204 | ML-DSA (Dilithium) | Digital signatures | ML-DSA-65: 1,952B public key, 3,293B signature |
| FIPS 205 | SLH-DSA (SPHINCS+) | Hash-based signatures | SLH-DSA-SHA2-128s: 32B key, 7,856B signature |
In March 2025, NIST selected HQC as a backup KEM algorithm to provide algorithm diversity against potential ML-KEM weaknesses.
What Is Already Deployed
TLS 1.3 hybrid key exchange is the migration’s leading edge. X25519MLKEM768 (IETF codepoint 0x11EC) combines classical X25519 with ML-KEM-768 in a single key exchange. A passive quantum adversary who records today’s TLS handshakes cannot decrypt them even with a future CRQC, because decrypting the ML-KEM component requires quantum resources the adversary does not have now. This is the “harvest now, decrypt later” defense.
- Chrome 131+ (November 2024): X25519MLKEM768 enabled by default
- Cloudflare edge: X25519MLKEM768 deployed
- Availability: You can test it today—if your browser is Chrome 131+ and the server supports it, the TLS handshake is already post-quantum protected
What is not yet deployed:
JWT signatures (RS256, ES256, PS256) still use classical algorithms. The IETF draft draft-ietf-cose-dilithium-11 defines COSE_Algorithm identifiers for ML-DSA for use in JOSE/COSE (the JWT/JWK ecosystem). As of May 2026, no major IdP has deployed ML-DSA JWT signing in production.
The implication: An attacker who records a JWT today and obtains a CRQC in 2032 can forge the JWT’s signature. JWTs with long lifetimes (refresh tokens) or sensitive claims are the priority for PQ signature migration.
The CNSA 2.0 Migration Timeline
The NSA’s Commercial National Security Algorithm Suite 2.0 establishes binding dates for national security systems. Industry treats these as leading indicators for enterprise timelines:
The JWT Migration Decision Tree
Not all JWTs have equal urgency. Prioritize by (lifetime × sensitivity):
| Token Type | Typical Lifetime | PQ Migration Priority | When |
|---|---|---|---|
| Refresh token | Days–months | Critical | 2027–2028 |
| ID token | Minutes–hours | High | 2028–2030 |
| Access token | Minutes | Medium | 2029–2031 |
| Verifiable Credential | Months–years | Critical | 2027–2028 |
| Code signing cert | 1–3 years | Critical | Before 2027 |
| TLS leaf cert | 90 days | Low (hybrid TLS covers) | Done (X25519MLKEM768) |
| CA root cert | 10–25 years | Critical | 2026–2028 |
Part 5 — The Deterministic 2025–2035 Auth Stack
What Is Already True (2025)
These are deployed at scale, not projections:
- Passkeys at 1B+ monthly active users. Google: 1B/month. Amazon: 175M accounts. Microsoft: default for all new accounts. The critical mass for passkey adoption has been reached—the infrastructure exists and is being used.
- OAuth 2.1 (draft-15) removes implicit grant, removes ROPC, mandates PKCE for all flows. Major IdPs (Okta, Auth0, Azure AD) are at or near compliance.
- SPIFFE/SPIRE graduated CNCF project—production workload identity in use at Uber, Bloomberg, Pinterest.
- RFC 9728 (April 2025) standardizes Protected Resource Metadata—the discovery layer for MCP-style agent authorization.
- CAEP/SSF (September 2025) OpenID Final specification—real-time token revocation signals. An IdP can push a revocation event to a resource server within milliseconds of detecting account compromise, rather than waiting for token expiry.
- Hybrid TLS (X25519MLKEM768) deployed on Chrome + Cloudflare—harvest-now-decrypt-later defense is already in place for new TLS sessions.
What Happens in 2026–2028
- EUDI Wallet mandate (December 31, 2026). EU member states must accept electronic identity wallets. W3C VC Data Model 2.0 (Recommendation May 2025) is the credential format. This creates the first large-scale deployment of verifiable credentials outside enterprise PKI.
- Transaction Tokens standardized (~2027). draft-ietf-oauth-transaction-tokens reaches RFC status. AI agent authorization frameworks begin adopting immutable delegation chains.
- Code signing goes post-quantum (2027). CNSA 2.0 mandate. Software supply chain attestation (Sigstore, in-toto) must migrate to ML-DSA.
- JWT PQ signing deployable (~2027–2028). draft-ietf-cose-dilithium reaches RFC. IdPs begin offering
ML-DSA-65as a signing algorithm option for long-lived tokens.
What Happens in 2029–2032
- Classical PKI roots deprecated. Enterprise CAs replace RSA-2048/ECDSA roots with ML-DSA or hybrid roots.
- Refresh tokens go PQ-signed. The harvest-now-decrypt-later risk on long-lived tokens closes.
- Multi-agent trust protocols mature. Transaction Tokens + Capability Tokens provide the primitives for auditable AI agent delegation in production.
- Behavioral biometrics standardized. Not as primary authentication, but as continuous session verification. The behavioral signal authenticates the ongoing session; the WebAuthn credential authenticates the initial bind.
The 2030 Auth Stack
What Does Not Change
Despite a decade of disruption, three properties remain load-bearing:
-
Cryptographic binding to an unphishable secret. The WebAuthn model—private key never leaves the authenticator, challenge signed over the origin—is the correct architecture. Post-quantum migration changes the algorithm, not the model.
-
Delegated authorization, not authentication. OAuth’s separation of authentication (who you are) from authorization (what you can do) is correct. AI agents amplify the need for fine-grained, revocable, auditable authorization—but they do not change the model, they stress-test it.
-
Short token lifetimes as defense in depth. No cryptographic system is permanently unbreakable. Tokens that expire in minutes or hours bound the window of compromise. This principle is unchanged by AI or quantum.
Part 6 — Modern Platform Readiness: Source-Verified Analysis
The table below reflects direct source analysis of three leading open-source IAM platforms cloned at their current HEAD (May 2026). Every cell is grounded in a specific file or grep result — not documentation claims.
Platforms analyzed:
- Keycloak —
github.com/keycloak/keycloak(Java, Red Hat-backed, most widely deployed OSS IdP) - Ory Hydra —
github.com/ory/hydra(Go, headless OAuth2/OIDC core, uses Fosite) - Zitadel —
github.com/zitadel/zitadel(Go, event-sourced, single-binary)
Cross-Platform Capability Matrix
| Capability | Keycloak | Ory Hydra | Zitadel | Why It Matters for 2025–2035 |
|---|---|---|---|---|
OAuth 2.1 / reject plain PKCE | PARTIAL | ✅ | PARTIAL | plain PKCE offers zero protection against code interception; OAuth 2.1 removes it entirely |
| DPoP enforcement (RFC 9449) | ✅ | ✗ | ✗ | Proof-of-possession binding makes stolen access tokens useless — critical for AI agent tokens |
| PAR — Pushed Auth Requests (RFC 9126) | ✅ | ✅ | ✗ | Removes auth params from browser URL; required for FAPI 2.0 and high-assurance flows |
| RFC 9728 — Resource Metadata | ✗ | ✗ | ✗ | Discovery protocol MCP agents use to find their authorization server autonomously |
| CAEP / SSF real-time revocation | ✗ | ✗ | PARTIAL | Real-time session revocation signals; Zitadel has event-sourced back-channel logout only |
| WebAuthn / Passkeys | PARTIAL | ✗ | ✅ | Structural phishing defense; Zitadel is first-class, Keycloak is authenticator plugin, Hydra delegates to Kratos |
| Post-quantum crypto (ML-KEM/ML-DSA) | ✗ | ✗ | ✗ | NIST FIPS 203/204 published Aug 2024; no OSS IdP has deployed PQ signing yet |
| Dynamic Client Registration (RFC 7591) | ✅ | ✅ | ✗ | AI agents must self-register; static pre-registration breaks zero-trust automation |
| FAPI 2.0 | PARTIAL | PARTIAL | ✗ | Financial-grade high-assurance profile; Keycloak ~80% there, Hydra has signed request objects |
| Token Exchange (RFC 8693) | ✅ | ✗ | ✅ | Foundation for multi-agent delegation — one agent acting on behalf of another with auditable chain |
✅ Implemented · PARTIAL = partial / configurable · ✗ Not found in source
The Five Things an AI-Agent-Ready IdP Needs
A secure AI agent authorization stack requires exactly five capabilities working together: DCR + DPoP + PAR + Token Exchange + RFC 9728. Here is where each platform stands:
| Platform | DCR | DPoP | PAR | Token Exchange | RFC 9728 | Score |
|---|---|---|---|---|---|---|
| Keycloak | ✅ | ✅ | ✅ | ✅ | ✗ | 4/5 |
| Zitadel | ✗ | ✗ | ✗ | ✅ | ✗ | 1/5 |
| Ory Hydra | ✅ | ✗ | ✅ | ✗ | ✗ | 2/5 |
No single platform covers all five. RFC 9728 is absent from every production OSS IdP — it was published April 2025 and implementations haven’t landed yet.
Three Cross-Cutting Findings
Finding 1: Keycloak is the only AI-agent-ready platform today (4/5).
It is the only codebase with DPoP cnf binding enforced at token use (DPoPUtil.validateBinding()), full RFC 8693 Token Exchange with DPoP-aware exchange (StandardTokenExchangeProvider), PAR, and DCR. The missing piece is RFC 9728 — Keycloak would need a /.well-known/oauth-protected-resource endpoint to be fully MCP-compatible. This is a single endpoint addition, not an architecture change.
Finding 2: Zitadel’s event-sourcing architecture is structurally superior for AI agent audit trails.
Every auth event in Zitadel — session creation, token issuance, token exchange, revocation, logout — generates an immutable event in the event store (internal/command/oidc_session_model.go). When an AI agent exchanges a token and acts on behalf of a user, that delegation chain is permanently logged with actor/subject pairs. Traditional RDBMS IdPs (Keycloak, OpenAM) have audit logs; Zitadel has an audit-by-default architecture where the log is the state. For regulated environments and high-stakes AI agent deployments, this is a meaningful architectural advantage.
Finding 3: Post-quantum is universally absent — and the window is tighter than platforms seem to realize.
ML-KEM (FIPS 203) and ML-DSA (FIPS 204) were published August 2024. Keycloak’s BouncyCastle dependency does not yet have production PQ support; Hydra’s HSM integration could accept a PQ-capable HSM but has no native algorithm; Zitadel has algorithm abstraction (SigningAlgorithm enum) but only RSA/ECDSA/EdDSA values. With CNSA 2.0 mandating new software signing go PQ by 2027, all three platforms need active migration planning now. The pluggable crypto provider patterns in Keycloak and Hydra are the right architecture — the algorithm values just haven’t been added.
The Composite Architecture
No single platform is complete. The pattern emerging in high-security deployments is Hydra as OAuth core + Kratos for identity + Keycloak or a standalone DPoP validator for proof-of-possession. For most organizations migrating from OpenAM, Keycloak’s 4/5 score and broad SAML coverage make it the pragmatic choice while the industry converges on RFC 9728 and CAEP. Zitadel is the pick for greenfield deployments where AI agent delegation and audit trails are first-class requirements.
OpenAM Implementation Lessons for Modern Systems
The OpenAM source code is a precise record of what a production OAuth2/OIDC implementation looked like at scale in 2015–2022. The lessons are not academic—they describe the state of systems still in production:
| OpenAM Pattern | What to Do Instead |
|---|---|
synchronized(code.intern()) replay lock | Distributed atomic compare-and-swap in shared token store (Redis SET NX, database FOR UPDATE) |
| Nonce not validated on return | Validate nonce from ID token against the value stored in client state before accepting the token |
plain PKCE accepted | OAuth 2.1 mandate: reject code_challenge_method=plain at the AS; clients must use S256 |
| DPoP stored but not enforced | At resource server: if cnf is present in the access token, require a valid DPoP proof header on every request |
realm_access.roles non-standard | Use standard roles claim per RFC 9068 (at+JWT) or map to entitlements per SCIM 2.0 |
| 20-claim access token always | Use structured access tokens (RFC 9068 at+JWT) with only the claims the resource server needs; token introspection for the rest |
Further Reading
- CVE History & Patch Matrix — why the implementation gaps above matter: four unpatched RCEs in ForgeRock CE 11.0.3
- OpenAM Deep Dive — full architecture analysis and fork comparison
- Protocol Deep Dives: Tokens — JWT, JWK, JWE, SD-JWT at the specification level
- Migration Recommendations — concrete effort estimates for moving off OpenAM
- NIST FIPS 203 — ML-KEM specification
- NIST FIPS 204 — ML-DSA specification
- RFC 9728 — OAuth Protected Resource Metadata
- draft-ietf-oauth-transaction-tokens — Transaction Tokens for AI agent delegation
- arXiv:2505.15917 — Gidney 2025: RSA-2048 under 1M qubits