presented_jti names the token actually presented; agent passes presented_token to the PS (#152) - #153
Merged
Conversation
…ted_token to the PS (#152) On a step-up or per-call challenge the request carries an auth token, and Resource Token Structure had the resource fill presented_jti from a record it cannot key. The resource now names the token it just verified, person or auth. The auth token request gains presented_token, REQUIRED; the PS-to-AS request's person_token becomes presented_token, passed through; PS and AS run one verification. Retention narrows to what revocation needs; unknown_person_token removed, invalid_presented_token added; expired_/revoked_person_token renamed to _presented_token. Auth token exp is capped at the presented token's exp. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017JbQcf8BB9PRyDoftadNjo
…152) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017JbQcf8BB9PRyDoftadNjo
dickhardt
force-pushed
the
presented-token
branch
from
September 8, 2026 09:57
59cde72 to
0be5db1
Compare
…e agent refreshes at five minutes A verifier judges exp against its own clock with no skew tolerance; iat is not a validity check. The agent absorbs skew: it SHOULD refresh a token with fewer than five minutes left and SHOULD NOT present one inside that margin — a presented token is verified at several parties in sequence, expiry propagates down the chain, and five minutes is the resource token's maximum lifetime, so a token with that much left when a resource token names it is still valid when the resource token is redeemed. Refresh runs from the agent token down. Refresh is unnecessary when the token will not be presented again; reactive renewal on expired_jwt is acceptable for an auth token presented only to the resource on an idempotent request. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEeAq61zr1oVg5FAFf3JTH
Never a reason to reject. Kept because neighbouring profiles (RFC 9068, OpenID Connect Core) require it, it is the issuance time audit reports, it gives a clock-free check of the issuer's lifetime ceiling (exp minus iat), and a verifier MAY bound token age by its own policy. Each token structure's iat line now points at the section. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEeAq61zr1oVg5FAFf3JTH
…st the five-minute margin Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEeAq61zr1oVg5FAFf3JTH
…ted window, not the refresh margin Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEeAq61zr1oVg5FAFf3JTH
…heck (match Expiry and the Refresh Margin) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEeAq61zr1oVg5FAFf3JTH
…fier's clock; wait, do not refresh Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEeAq61zr1oVg5FAFf3JTH
This was referenced Sep 8, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Addresses #152.
What changes
presented_jtinames the token the request actually carried. Person token on the first challenge of a grant, auth token on a step-up or per-call challenge. The resource copiesps,sub,mission_s256, andtenantfrom whichever it verified and keeps no record. Resource Token Structure previously had the resource fill the value on a step-up from "its record of the person token it verified earlier," which it cannot key: an auth token carries no reference to the person token or the resource token, and(ps, sub, agent key)is the tuple §Why a Resource Token Names the Person Token already shows does not identify one person token.presented_token, REQUIRED. The agent passes the token it presented. It already holds it.person_tokenbecomespresented_token, passed through.agent_tokenis unchanged; the AS still gets the AP's claims for policy.presented_tokenbytypwith the two substitutions the AS already applied (aud= resource tokeniss,cnf.jwk=agent_jkt), then checksjti=presented_jtiand claims against the resource token. The AS section points at that step.jti,aud,exp, and any AS it presented to, for revocation, untilexpplus skew. The lookup on the request path is gone.unknown_person_tokenremoved.invalid_presented_tokenadded.expired_person_tokenandrevoked_person_tokenrenamed toexpired_presented_tokenandrevoked_presented_token, following the<parameter>_tokenpattern from Revocation: resource tokens, and what a revoked token gets back #150.exp, whichever type. A step-up on a nearly expired auth token yields a nearly expired auth token; the existing early-refresh guidance is the way back to a full-length chain, and the refresh paragraph now says so.presented_jtieach auth token was issued against and follows its own records back to the person token on a step-up chain.person_tokenin PS-to-AS, the revocation error names) are adjusted in place since -11 is unpublished.Also in this PR
presented_jtiis the person token or, on a per-call challenge, the auth token.Not in this PR
login_endpointflow (§Login) creates a resource token without a presented token. That was already inconsistent with the person-token-first rule and is untouched here.🤖 Generated with Claude Code
https://claude.ai/code/session_017JbQcf8BB9PRyDoftadNjo