SMART Permission Tickets
0.1.0 - ci-build
SMART Permission Tickets, published by . This guide is not an authorized publication; it is the continuous build for version 0.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/jmandel/smart-permission-tickets-wip/ and changes regularly. See the Directory of published versions
Status: Draft for discussion | Author: Josh Mandel | Date: June 4, 2026
The base specification defines ticket redemption for local access token issuance. It does not define portable continuation credentials and does not require Data Holders to issue refresh tokens after ticket redemption.
This proposal defines an optional top-level continuation claim that lets an issuer bound the continuation credentials (such as refresh tokens) a Data Holder may derive from a successful ticket redemption. It addresses scenarios where access should outlive a single session without requiring the client to re-present the ticket for every token refresh.
For scenarios requiring access beyond a single session (e.g., ongoing care relationships, research studies), two approaches work within the base specification alone:
Approach 1: Refresh via Issuer
The client periodically obtains fresh tickets from the issuer. Suitable when:
Approach 2: Long-Lived Tickets with Revocation
The issuer mints a ticket with extended validity (weeks to months) and supports revocation. Suitable when:
A third pattern — the Data Holder issuing a local refresh token derived from an accepted ticket — is common OAuth practice but raises questions the base specification deliberately does not answer: how long may derived credentials live, and how does ticket revocation reach them? This proposal answers those questions with an explicit, issuer-controlled bound.
Permission Tickets, access tokens, and refresh tokens play distinct roles:
exp: expiration controls when the ticket can be used for new token exchange redemption.continuation ClaimThis proposal defines an optional top-level continuation claim in the Permission Ticket claims set. The claim bounds Data Holder-issued continuation credentials:
{
"exp": 1777478400,
"jti": "ticket-123",
"continuation": {
"refresh_token": {
"allowed": true,
"not_after": 1780160400,
"revocation_check": "required"
}
}
}
Draft requirements:
continuation is absent, Data Holders SHALL NOT issue refresh tokens that remain usable after the ticket's exp.continuation.refresh_token.allowed is true, a Data Holder MAY issue a refresh token derived from successful ticket redemption.continuation.refresh_token.not_after.continuation.refresh_token.revocation_check is required, the Data Holder SHALL check the source ticket's revocation status before honoring the derived refresh token.exp SHALL carry a revocation claim, and its revocation_check SHALL be required — otherwise revoking the ticket could not reach the credentials derived from it.exp, the ticket's revocation status remains authoritative for those derived refresh tokens until continuation.refresh_token.not_after.exp SHALL maintain ticket revocation status until at least continuation.refresh_token.not_after.The base specification states only that Data Holders are not required to issue refresh tokens after ticket redemption, and that any local continuation credential SHALL NOT authorize broader access than the effective grant computed at redemption time. Everything beyond that — the continuation claim, its lifetime bound, and its revocation linkage — lives in this proposal and is not part of base conformance unless adopted by the base or by a ticket-type profile.
Open Question (OQ-P4A): Adoption Path. Should the
continuationclaim be promoted into the base claims set once implementations validate it, or should it remain a composable extension that individual ticket-type profiles or trust frameworks adopt?