Skip to content

docs: review documentation and spec-citation fixes - #690

Merged
osanderson merged 2 commits into
mainfrom
docs/review-citations
Oct 20, 2026
Merged

osanderson merged 2 commits into
mainfrom
docs/review-citations

Conversation

@osanderson

Copy link
Copy Markdown
Collaborator

Batch I of the 2026-10-18 review: the missing documentation and the wrong spec citations. Comments, docs, and a few error-message citations only; no behaviour changes.

Missing documentation

Where What it now says
client.BeginAuthorization Call it only from a deliberate, CSRF-protected request (a POST with a SameSite cookie or a CSRF token), not a plain GET any page can trigger.
resource.NoRevocation A token the authorization server revoked stays usable until it expires, which falls short of what a FAPI deployment expects of a resource server.
resource.Dependencies.Nonces Never the authorization server's own nonce store: RFC 9449 §8 and §9 keep them apart. serverresource refuses that; a Verifier built directly can't tell.
federation.CheckTrustMarkStatus Call it after VerifyTrustMark, never instead of it.
README Message Signing covers JAR and JARM; signed introspection responses aren't implemented.

The review's other documentation items were already done: per-issuer stores (#680), the WithQuery doc (#685), and an empty AllowedResources (already documented).

Spec citations

A re-audit of about 140 citations against the published texts confirmed these wrong ones:

  • RFC 9101:
    • §5.3 doesn't exist; the request object's client_id rule is §6.3.
    • request_uri is refused at PAR by RFC 9126 §2.1, and inside a request object by RFC 9101 §4.
    • invalid_request_uri is defined in RFC 9101 §7, not RFC 9126 §2.3.
  • RFC 9449:
    • resource-server nonces are §9, not §8;
    • "at most one DPoP header" is §4.3 check 1, not §7.1, and a sentence quoted as the RFC's isn't in it.
  • OIDC Core:
    • at_hash is §3.1.3.8 / §3.2.2.9 (OPTIONAL for the code flow), not a MUST in §3.1.3.6;
    • azp is §3.1.3.7 steps 4–5 in the current text;
    • the "different user" rule is §3.1.2.2.
  • CIBA: one-time auth_req_id redemption is §10.1.1 and poll mode §10.1, not §10.3 (Push Callback).
  • RFC 7518: A256CBC-HS512 is §5.2.5, and ECDH-ES+A256KW is §4.6.
  • OpenID Federation: the Trust Mark kid rule is §7; delegation validation is §7.2.2 (the type match is step 8); the delegation JWT's own rules are §7.2.1.
  • Others: RFC 8705 chain validation and revocation are §2.1, and RFC 7592's registration access token is §1.2.
  • Wording: RFC 9449 §10.1 doesn't recommend the PAR DPoP proof; it says the proof "provides a stronger binding". The wording now says that.
  • Already fixed: the leftover draft-07 attestation citation in a test now cites draft-12 §10.3.

Testing

  • go vet ./... and go test ./... pass.
  • gofmt is clean.

🤖 Generated with Claude Code

osanderson and others added 2 commits October 20, 2026 08:04
…d where nonces and trust mark status belong

- client.BeginAuthorization: call it only from a request the user made
  on purpose and that's protected against CSRF, not a plain GET any page
  can trigger.
- resource.NoRevocation: a token the authorization server revoked
  stays usable until it expires, which falls short of what a FAPI
  deployment expects of a resource server.
- resource.Dependencies.Nonces: never the authorization server's own
  nonce store (RFC 9449 §8 and §9 keep them apart);
  serverresource.NewVerifier refuses that, a Verifier built directly
  can't tell.
- federation.CheckTrustMarkStatus: call it after VerifyTrustMark, never
  instead of it.
- README: Message Signing covers JAR and JARM; signed introspection
  responses aren't implemented.
- A test comment still cited draft-07 of attestation-based client
  authentication; it's draft-12 §10.3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each of these was checked against the spec text:
- RFC 9101 has no §5.3; the request object's client_id rule is §6.3.
- request_uri at PAR is refused by RFC 9126 §2.1, and inside a request
  object by RFC 9101 §4, not RFC 9101 §5.
- invalid_request_uri is defined in RFC 9101 §7, not RFC 9126 §2.3.
- Resource-server DPoP nonces are RFC 9449 §9, not §8.
- "At most one DPoP header" is RFC 9449 §4.3 check 1, not §7.1; the
  quoted "MUST NOT send this header field multiple times" isn't in the
  RFC.
- at_hash: OIDC Core §3.1.3.8 lets a code-flow client validate it as
  §3.2.2.9 describes; it isn't REQUIRED for the code flow (§3.1.3.6).
- azp: the current OIDC Core §3.1.3.7 has it at steps 4-5, not 9-10.
- CIBA: one-time auth_req_id redemption is §10.1.1, poll mode §10.1,
  not §10.3 (Push Callback).
- A256CBC-HS512 is RFC 7518 §5.2.5, and ECDH-ES+A256KW §4.6, not
  §5.2.3 and §4.7.
- OpenID Federation: the Trust Mark kid rule is §7, the delegation
  validation steps §7.2.2 (the trust_mark_type match is step 8), and the
  delegation JWT's own rules §7.2.1.
- RFC 8705 chain validation and revocation are §2.1, not §2.1.1;
  RFC 7592's registration access token is defined in §1.2; the "MUST
  NOT reply ... for a different user" rule is OIDC Core §3.1.2.2.
- RFC 9449 §10.1 doesn't recommend the PAR DPoP proof over dpop_jkt;
  it says the proof "provides a stronger binding".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@sonarqubecloud

Copy link
Copy Markdown

@osanderson
osanderson merged commit 6a99d69 into main Oct 20, 2026
18 checks passed
@osanderson
osanderson deleted the docs/review-citations branch October 20, 2026 00:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant