| Internet-Draft | OAuth Mission Issuance Grant | October 2026 |
| McGuinness | Expires 5 April 2027 | [Page] |
This specification defines the Mission Issuance Grant, a profile of the JSON Web Token (JWT) authorization grant of RFC 7523. A Mission Authority Server approves and records Missions without changing an estate's OAuth Authorization Servers. Under this profile it also issues, for an active Mission, a short-lived, audience-restricted, single-use JWT that the client presents at an Authorization Server's token endpoint. The Authorization Server validates the grant and issues Mission-bound tokens: they carry the Mission, are bounded by the authority the grant conveys, and expire no later than the Mission. An Authorization Server that checks Mission state at redemption and at every refresh stops issuing and renewing those tokens once the Mission is no longer active, and narrows them when its authority is narrowed; one that does not check issues no refresh tokens. Approval, the Mission record, and its lifecycle stay at the Mission Authority Server.¶
This note is to be removed before publishing as an RFC.¶
The latest revision of this draft can be found at https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission-issuance-grant.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-mcguinness-oauth-mission-issuance-grant/.¶
Source for this draft and an issue tracker can be found at https://github.com/mcguinness/mission-bound-authorization.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 5 April 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
Mission-Bound Authorization for OAuth 2.0 [I-D.draft-mcguinness-oauth-mission] (the "issuance profile") binds issued authority to a durable, human-approved Mission, with the Authorization Server (AS) as the Mission Issuer. The Mission Authority Server (MAS, [I-D.draft-mcguinness-mission-authority-server]) hosts the same Mission without changing the estate's Authorization Servers: it validates Mission Intents, runs approval, records Missions, and operates their lifecycle. The tokens those Authorization Servers issue remain ordinary. They do not carry the Mission, and their issuance and refresh do not depend on Mission state; enforcement can relate them to a Mission only at the point of use, through the Mission Join.¶
This specification defines the issuance join, in which the MAS remains the Mission Issuer and an estate's AS issues Mission-bound tokens. The carrier is the Mission Issuance Grant, a JWT the MAS issues for an active Mission and the client presents to the AS as a JWT authorization grant [RFC7523]. RFC 7523 defines how a client presents a JWT as an authorization grant and how the AS validates it. This profile defines what the grant contains, how the MAS issues it, what the AS issues in return, and how the AS keeps issuance and refresh bounded by the Mission's current state and authority.¶
Every grant is issued against current Mission state, so a revoked Mission receives no new grants. An AS with a Mission-state integration (Section 2) also checks the Mission at redemption and at every refresh; one without issues no refresh tokens, so its tokens end with their own short lifetime. Either way, every path to new tokens passes a Mission-state check: the issuance-gate kill switch that a MAS alone does not provide ([I-D.draft-mcguinness-mission-authority-server]).¶
The AS implements none of the issuance profile's intake, approval ceremony, authority derivation, record, or lifecycle surfaces; those stay at the MAS. A deployment can adopt the issuance join at some Authorization Servers and keep the Mission Join at others (Section 9).¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This document uses Mission, Mission Intent, Authority Set, Mission
Issuer, the mission claim, the subset rule, and the integrity
anchor authority_hash as the issuance profile defines them; Mission
Authority Server (MAS), Mission Join, and the Enterprise Mapping
Contract as [I-D.draft-mcguinness-mission-authority-server] defines
them; and Effective Authority Set as
[I-D.draft-mcguinness-oauth-mission-status] defines it. Under this
profile the MAS is the Mission Issuer. It additionally uses:¶
The integration this document defines: a MAS-approved Mission carried by a grant that an Authorization Server redeems at its token endpoint.¶
The signed assertion of Section 4, issued by the MAS and redeemed for Mission-bound tokens.¶
An OAuth Authorization Server [RFC6749] that redeems Mission Issuance Grants at its token endpoint; conformance role of Section 10.¶
A consuming AS's means of resolving the Mission's current state and Effective Authority Set at redemption and at every refresh (Section 6.3.1). A consuming AS either has one and applies Section 6.3, or has none and issues no refresh tokens under a grant (Section 6.3.6).¶
The following figure shows the issuance join between the client, the MAS, and a consuming AS:¶
Client MAS Consuming AS
| | |
|-- (A) grant request --->| |
|<-- (B) grant -----------| |
| | |
|-- (C) token request with the grant ------------------->|
| |<-- (D) Status, per resource -|
| |--- state and Effective ----->|
| | Authority Set |
|<-- (E) access token (and refresh token) ---------------|
| | |
|-- (F) refresh request -------------------------------->|
| |<-- (D) repeated -------------|
|<-- (E) new tokens -------------------------------------|
¶
(A) The client requests a grant from the MAS for an active Mission, naming the consuming AS as the audience (Section 5).¶
(B) The MAS returns a grant bound to that AS and to the client, and carrying a subset of the Mission's current authority (Section 4).¶
(C) The client presents the grant at the consuming AS's token endpoint as a JWT authorization grant (Section 6).¶
(D) A consuming AS with a Mission-state integration resolves the Mission's current state and Effective Authority Set, with one Mission Status request per resource the grant names (Section 6.3).¶
(E) The consuming AS issues Mission-bound tokens within the grant's authority and that set (Section 6.2).¶
(F) Each refresh repeats (D) before (E). A consuming AS without a Mission-state integration skips (D) and issues no refresh token (Section 6.3.6).¶
Trust is pre-established and bilateral. A consuming AS accepts
grants only from Mission Issuers its local policy names, resolving
their signing keys through the MAS's published key material (its
discovery jwks_uri,
[I-D.draft-mcguinness-mission-authority-server]); a MAS mints
grants only for Authorization Servers named as audiences by
deployment configuration. Subject and client correspondence between
the Mission record and the consuming AS's accounts is governed by
the deployment's mapping policy; where the Enterprise Mission
Authority Profile is claimed, its mapping contract governs
([I-D.draft-mcguinness-mission-authority-server]). The resources
the MAS scopes a consuming AS's grants to (Section 5.2) are the
audiences it authorizes that AS to request from Mission Status
(Section 6.3.1).¶
The duties divide as follows. The MAS holds the approval event, the record and its anchors, the lifecycle, and grant minting. The consuming AS holds client authentication, token minting bounded by the grant, refresh, and its ordinary token-plane obligations. An auditor attributes what was approved to the MAS record and what was issued to the consuming AS's log, joined by the Mission reference the grant carries.¶
Tokens issued under this profile are Mission-bound: they carry the
mission claim, their authority is a subset of the consented
Authority Set, and their issuance is gated on Mission state, at grant
issuance always and at redemption and every refresh where the
consuming AS has a Mission-state integration.¶
Runtime enforcement reads the Mission from these tokens (credential-carried composition, [I-D.draft-mcguinness-mission-runtime]), so the Mission Join's limit does not apply to them: the join proves a credential belongs to the Mission's parties, never that it was issued for the Mission ([I-D.draft-mcguinness-mission-authority-server], Section "Mission Join"). Tokens the estate issues outside this profile are unchanged and continue to compose through the Mission Join.¶
A Mission Issuance Grant is a JWT [RFC7519] signed as a JWS
[RFC7515] by the Mission Issuer. Its JOSE header MUST carry the
typ header parameter with the value mission-issuance-grant+jwt
(Section 13), alg, and a kid that
resolves in the Mission Issuer's published key material. A JWT with
any other typ, a Mission Mandate
([I-D.draft-mcguinness-mission-mandate]) in particular, is not a
Mission Issuance Grant and is refused at redemption
(Section 6.1).¶
Claims:¶
iss:REQUIRED. The Mission's issuer: the MAS issuer URL.¶
sub:REQUIRED. The Mission's recorded Subject identifier
(subject.sub), interpreted at the consuming AS under the
deployment's mapping policy (Section 3.2).¶
aud:REQUIRED. The consuming AS's issuer identifier (Section 6.1).¶
iat, exp:REQUIRED. exp MUST NOT be more than 300 seconds after iat.¶
jti:REQUIRED. Unique per grant; single use (Section 6.3.4).¶
client_id:REQUIRED. The Mission's recorded agent client identifier as the consuming AS knows it (Section 4.3 of [RFC8693]); the MAS sets it under the deployment's mapping policy (Section 3.2). Only this client can redeem the grant (Section 6).¶
mission:REQUIRED. The issuance profile's mission claim object, with the
members Section 4.1 requires.¶
authorization_details:REQUIRED. The mission_resource_access entries [RFC9396] the
consuming AS issues against: a subset of the Mission's Effective
Authority Set, scoped to the resources this AS serves
(Section 5.2).¶
cnf:OPTIONAL. A confirmation claim [RFC7800] binding redemption to a
key: the jkt member for OAuth 2.0 Demonstrating Proof of
Possession (DPoP, Section 6.1 of [RFC9449]), or the x5t#S256
member for mutual TLS (Section 3.1 of [RFC8705]), set by the MAS
only from a sender constraint it verified on the grant request
(Section 5.2). When it is
present, the consuming AS MUST require proof of possession of that
key at redemption: a DPoP proof in the token request whose public
key has the jkt thumbprint, or a client certificate on the TLS
connection whose SHA-256 thumbprint matches the x5t#S256 value.¶
The following is an example of a decoded grant payload; the
authority_hash value is illustrative:¶
{
"iss": "https://mas.example.com",
"sub": "user_3p2q8mN1a0kV7tR",
"aud": "https://as.example.com",
"iat": 1793606400,
"exp": 1793606580,
"jti": "mig_7Kq2Rv9Lp4xW1nT8",
"client_id": "s6BhdRkqt3",
"mission": {
"id": "msn_8RfX2Lqv9TqMv4z7sA2bN1k0YpEdHc9-",
"issuer": "https://mas.example.com",
"authority_hash":
"sha-256:R6tY2nD9bM7sX1cF8gH2vJ4kE5pNQl3KvZ4mP5x0wQr",
"expires_at": "2026-12-31T23:59:59Z"
},
"authorization_details": [
{
"type": "mission_resource_access",
"resource": "https://api.example.com/invoices",
"actions": ["read"],
"constraints": {
"resource_issued_after": "2026-07-01T00:00:00Z"
}
}
]
}
¶
mission Claim
The grant's mission claim is the issuance profile's mission claim
object, whose id and issuer members the issuance profile defines
([I-D.draft-mcguinness-oauth-mission], Section "The Mission Claim").
This profile requires two further members:¶
expires_at. The issuance profile defines expires_at as a
REQUIRED Mission Record member and an OPTIONAL member of the
mission claim it mirrors. This profile elevates the claim mirror
to REQUIRED for the credentials it governs. The Lifetime rule
(Section 6.2) depends on that elevation: it caps every token
issued under the grant at the mission object's expires_at.¶
authority_hash. The mission object MUST carry
authority_hash ([I-D.draft-mcguinness-oauth-mission], Section
"Integrity Anchors"), reintroducing it beyond the issuance profile's
baseline claim as this profile's lineage anchor: it names the
approved Authority Set the grant derives from, for a consuming AS
that, without a Mission-state integration, has no further channel
back to the Mission Issuer once it holds the grant. The consuming
AS records it with each issuance (Section 6.2) and does not
verify it.¶
A MAS implementing this profile serves a Mission Issuance Grant
endpoint, published as mission_issuance_grant_endpoint in its
metadata (Section 8).¶
The requester POSTs an application/json object to the endpoint over
TLS, authenticated as Section 5.2 requires:¶
mission_id:REQUIRED. A string. The Mission the grant is minted for; its
issuer is this MAS.¶
audience:REQUIRED. A string. The consuming AS the grant is for, becoming the
grant's aud. The MAS mints only for audiences its configuration
names (Section 3.2).¶
authorization_details:OPTIONAL. An array. A narrower subset the requester asks the grant to carry, under the issuance profile's subset rule. If it is omitted, the MAS scopes the grant to the entries the named audience serves (Section 5.2); if it is present, it MUST NOT widen beyond that scope.¶
The following is an example of a grant request:¶
The MAS MUST apply the following rules:¶
Requester. The MAS authenticates the requester as its Mission
submission endpoint does
([I-D.draft-mcguinness-mission-authority-server], Section
"Mission Submission"). The requester MUST be the Mission's
recorded client. Any other caller, including a delegate or
enforcement point that the Mission Join Assertion endpoint admits,
receives not_found, which preserves the MAS's anti-oracle
property.¶
State gate. A grant is minted only while the Mission is
active, established from the MAS's own record at minting. In any
other state the MAS refuses.¶
Subset and audience. The grant's authorization_details MUST
be a subset, under the issuance profile's subset rule
([I-D.draft-mcguinness-oauth-mission], Section "Subset Rule"), of
the Mission's current Effective Authority Set
([I-D.draft-mcguinness-oauth-mission-status]). That is the
consented Authority Set less what any composed narrowing companion
has removed; a grant is a derivation, so a contained capability is
absent from it ([I-D.draft-mcguinness-oauth-mission-containment],
Section "Derivation Gating"). The grant MUST carry only the
entries the named consuming AS serves. The requester MAY request a
narrower subset. The MAS MUST refuse a request for a wider one.¶
Derivation event. Each grant minted is a derivation event.
Where the Mission's established derivation_limit
([I-D.draft-mcguinness-oauth-mission-derivation-limits]) is set, the MAS MUST count
grants against it atomically and refuse beyond
it, which gives that ceiling a binding locus under the standalone
binding. A grant counts when its minting commits. Redemption and
refresh at a consuming AS do not increment this counter, so the
limit bounds the grants the MAS issues, not the number of tokens
consuming Authorization Servers issue from them
([I-D.draft-mcguinness-oauth-mission-derivation-limits], Section
"Mission Issuance Grant Minting").¶
Key binding. When the MAS includes cnf, it MUST take the key
from a sender constraint it verified on the grant request: the
public key of the request's DPoP proof, as jkt, or the client
certificate of the mutual-TLS connection, as x5t#S256 (the TLS
handshake proves possession of its key whether or not the
certificate also authenticated the client). The MAS MUST NOT
derive cnf solely from client-assertion authentication: a
private-key-JWT client assertion authenticates the client, and DPoP
is not client authentication (Section 3 of [RFC9449]), so only an
independent sender-constraint verification on the request supplies
the binding, even where it proves the same key. A grant request with
no verified
sender constraint yields a grant without cnf. The redemption
rules for client authentication and public clients
(Section 6) apply unchanged, so a public client cannot redeem
such a grant.¶
Evidence. Each minting is recorded with the Mission record:
the jti, audience, requested and granted entries, any cnf, and
time.¶
On success the endpoint returns HTTP 200 with an application/json
object:¶
grant:REQUIRED. A string. The Mission Issuance Grant JWT of Section 4. Its
exp bounds redemption (Section 6.1).¶
expires_in:REQUIRED. A JSON integer. The number of whole seconds from the
generation of the response until the grant's exp, rounded down so
that it never indicates a time after exp.¶
The following is an example of a grant response:¶
A failure returns the MAS error object
([I-D.draft-mcguinness-mission-authority-server]): a JSON body with a
REQUIRED error string and an OPTIONAL error_description. This
endpoint uses:¶
| error | HTTP | Condition |
|---|---|---|
invalid_request
|
400 | Missing or malformed mission_id or audience, or an unparseable body |
unauthorized
|
401 | Request not authenticated |
not_found
|
404 | Unknown mission_id, or the requester is not the Mission's recorded client |
invalid_audience
|
400 |
audience names no AS this MAS issues grants for |
mission_not_active
|
409 | The Mission is not active
|
invalid_authorization_details
|
400 | The request is wider than the Effective Authority Set or the audience's scope |
derivations_exhausted
|
409 | The Mission's derivation_limit is reached |
derivations_exhausted is the condition the mission_error value of
that name reports at a token endpoint
([I-D.draft-mcguinness-oauth-mission-derivation-limits]).
not_found covers both an unknown Mission and a requester that is not
the recorded client, so the split never becomes a membership oracle;
invalid_audience, mission_not_active,
invalid_authorization_details, and derivations_exhausted are
returned only to the authenticated recorded client, to which Mission
state is already visible.¶
The client presents the grant to the consuming AS's token endpoint as a JWT authorization grant [RFC7523]. The following example shows a confidential client that authenticates with a JWT (Section 2.2 of [RFC7523]); line breaks are for display purposes only:¶
The grant is an authorization, not a client credential: the client
still proves it is the grant's client_id. A confidential client
authenticates to this AS as Section 3.2.1 of [RFC6749] requires, and
possession of a cnf key does not replace that authentication. A
public client, which cannot authenticate, sends client_id in the
request and can redeem only a grant that carries cnf: proof of
possession of that key binds the redemption to the grant's
client_id, and without cnf nothing does.¶
In addition to the processing Section 3 of [RFC7523] requires, the consuming AS MUST validate the following and refuse the request if any check fails:¶
the typ JOSE header parameter is mission-issuance-grant+jwt,
checked first so that no other artifact's validation rules are
applied to the grant (Section 3.11 of [RFC8725] and
Section 3.12 of [RFC8725]);¶
the signature, under a kid resolving in the published key
material of an iss its local policy trusts for issuance joins;
and the mission claim's issuer equals iss;¶
aud names this AS; exp is no more than 300 seconds after
iat, compared exactly; iat is not after the current time and
exp is after it, with the clock-skew leeway of
Section 4.1.4 of [RFC7519] applied to these two comparisons with
the current time only; and the jti has not been seen. The record
of a seen jti is written atomically with successful issuance and
retained until exp plus that leeway passes (Section 6.3.4);¶
the client is the grant's client_id (Section 6): the
authenticated client equals it, or, for a public client, the grant
carries cnf; and whenever cnf is present, the request proves
possession of that key (Section 4);¶
sub maps to a local account under the deployment's mapping
policy (Section 3.2), and the grant's authorization_details
map to resources this AS serves.¶
On success the consuming AS mints tokens under these rules:¶
mission claim. Issued tokens carry the grant's mission
object as the issuance profile's mission claim, unchanged except
that they need not carry authority_hash; id, issuer, and
expires_at always carry over (Section 4.1). The consuming AS
records authority_hash with each issuance, beside the Mission
reference that joins its issuance log to the MAS record (Section 3.2).¶
Subset. Issued authorization_details MUST be a subset of the
grant's. The consuming AS's own policy can only narrow them: it
MUST NOT widen, remap, or supplement them. Representing them as
scope (below) is not a remapping.¶
Token response. The token response carries the issued
authorization_details as the issuance profile requires for
Mission-bound issuance ([I-D.draft-mcguinness-oauth-mission],
Section "Mission-Bound Access Tokens", and Section 7 of [RFC9396]),
any projected scope beside them (Section 5.1 of [RFC6749]), and
the mission_id and mission_expires_at parameters as the issuance
profile recommends ([I-D.draft-mcguinness-oauth-mission], Section
"Binding the Mission to the Grant").¶
Scope projection. Where a target's enforcement path consumes
scope, the consuming AS also projects the issued
authorization_details to scope under the issuance profile's
scope-projection rule ([I-D.draft-mcguinness-oauth-mission],
Section "Scope Projection"): every issued scope value corresponds
to authority the grant conveys, and none conveys authority, or
relaxes a constraint, that the grant does not. The consuming AS
therefore supports [RFC9396] even where its targets consume only
scope.¶
Lifetime. The consuming AS MUST NOT issue an access or refresh
token under the grant with an expiry later than the mission
object's expires_at. That ceiling is the Mission horizon, not a
liveness bound, so access tokens issued under a grant SHOULD be
short-lived: absent a redemption-time state check, an issued access
token's own lifetime is the window in which a revoked Mission's
token keeps working at the token layer.¶
Effective Authority Set projection. A consuming AS with a Mission-state integration gates redemption and every refresh on current Mission state and projects the issued authority through the Mission's current Effective Authority Set (Section 6.3).¶
No re-approval. The approval event already occurred at the Mission Issuer. The consuming AS MUST NOT prompt the Subject or any user for consent at redemption.¶
The following is an example of a successful token response:¶
A grant redeems exactly once (Section 6.3.4). Later token needs are met by the issued refresh token (state-gated) or a fresh grant (state-gated at minting), so every path to new authority re-enters a Mission-state gate.¶
A consuming AS with a Mission-state integration applies this section at redemption and at every refresh. Section 6.3.4 applies to every consuming AS, and Section 6.3.6 states what applies to one without an integration.¶
A consuming AS with a Mission-state integration MUST, at redemption
and at every refresh, resolve the Mission's current state and
Effective Authority Set through the Mission Status operation
([I-D.draft-mcguinness-oauth-mission-status]) or an equivalent
authority source, and refuse when the Mission is not established
active. An equivalent source MUST be authenticated, MUST be
audience-scoped to the resources this AS serves, MUST carry the
Mission's current authorization_details and a monotonic state
version, and MUST answer within a staleness bound the deployment
publishes
(Section 10).¶
Through the Mission Status operation, the consuming AS resolves
authority per resource, not for an audience of its own. For each
distinct resource value among the grant's mission_resource_access
entries (on refresh, among the refresh family's ceiling), it sends one
request whose audience is that resource value, unchanged; the
Mission Issuer authorizes it separately for each audience it requests
([I-D.draft-mcguinness-oauth-mission-status], Section "Request").
The consuming AS validates each response against the audience it
requested, and MUST combine only responses whose mission.issuer,
mission.id, and mission.version are identical. The rollback test
compares each response with the version the AS retained for the
Mission before this resolution began: a response below that retained
version is a rollback (Section 6.3.3). Versions collected
within the resolution may differ from one another. The AS re-queries
each audience whose response is below the highest version collected,
without using a cached response, up to a bound the deployment
configures, and never accepts a version below the retained one. Once
all responses report one version, the AS combines them and retains
that version. If it still cannot obtain responses at one version
within the bound, the state source has failed
(Section 6.3.3): the AS refuses with
temporarily_unavailable, and the presented grant, refresh token, or
authorization code stays unconsumed (Section 6.3.4,
Section 7). A not-found response for an audience the grant
names means the Mission is not established active, and the AS
refuses with invalid_grant. Each response is authenticated, scoped
to the requested audience, and carries current
authorization_details and the Mission's state version.¶
Lifecycle state alone, such as an active state or a Status List
VALID bit, is not enough from any source: containment and discharge
narrow an active Mission without changing its lifecycle state, and a
Status List bit carries no authorization_details.¶
A source that is unavailable, fails verification, or reports a state
version older than one already observed for this Mission is a
transient failure, never authority exhaustion, and is refused in a
machine-readable shape: this profile defines a token-endpoint use of
the OAuth temporarily_unavailable error code [RFC6749]
(Section 13.4), carried with HTTP status 503. The
response MAY carry Retry-After per the
deployment's declared state-recovery policy. For a per-resource
resolution, the version already observed is the one the AS retained
before the resolution began; versions collected within it are
reconciled as Section 6.3.1 describes, and responses that
cannot be brought to one version are the same transient failure.
The consuming AS leaves its stored ceiling unchanged. invalid_grant
stays for the permanent classes: an invalid, expired, or replayed
grant, a Mission that is not established active, and a genuinely
empty current intersection.¶
Consumption is atomic with issuance. The single-use jti check of
Section 6.1 refuses a grant already recorded; the record itself is
written atomically with successful issuance, after the state gate and
this projection. A redemption that fails before issuance, a transient
source failure in particular, therefore leaves the grant unconsumed
and retryable, and concurrent redemptions of one grant are resolved by
that atomic record: the loser is a replay, refused invalid_grant. On
the refresh path a transient source failure MUST NOT consume or rotate
the presented refresh token, so the client retries with the credential
it already holds. Under the authorization code flow carriage, PAR
validation is the consuming step instead (Section 7).¶
A refresh family's issued authority MUST NOT widen across refreshes
within the same Mission: the consuming AS atomically narrows its own
stored ceiling on every refresh, or retains the highest Mission state
version it has observed and rejects a source reporting a lower one
as a rollback.¶
A consuming AS without a Mission-state integration MUST NOT issue
refresh tokens under a grant, and relies instead on the grant's
active-at-minting gate and the short access-token lifetime above. A
source that reports lifecycle state alone is not a Mission-state
integration under this profile (Section 6.3.1). A consuming
AS that cannot perform this projection MUST NOT claim containment- or
discharge-aware issuance.¶
The consuming AS responds to a failed redemption or refresh with an
error response as defined in Section 5.2 of [RFC6749]. A grant that
fails any check of Section 6.1 is refused with the
invalid_grant error code (Section 3.1 of [RFC7523]), and failed
client authentication with invalid_client. The other refusals are:¶
| Condition | Response |
|---|---|
The Mission is not active
|
invalid_grant
|
| The authorization is exhausted (Section 6.3.2) |
invalid_grant
|
The requested scope does not intersect the surviving authority |
invalid_scope
|
The requested authorization_details does not intersect the surviving authority |
invalid_authorization_details
|
| The state source fails (Section 6.3.3) |
temporarily_unavailable, HTTP 503 |
A client tells three cases apart:¶
Retry. temporarily_unavailable with HTTP 503 means the
authorization is intact and the same credential can be presented
again, without parsing error_description. invalid_scope and
invalid_authorization_details name a request the client can
narrow and re-send under the same grant.¶
Get a fresh grant. An expired or already redeemed grant is cured by obtaining a fresh one (Section 5). The other grant validation failures (an untrusted issuer, a wrong audience, an unmappable subject or authority) are configuration faults that a fresh grant does not cure.¶
Stop. While the Mission stays out of the active state,
neither a retry nor a fresh grant cures the refusal. The AS SHOULD
include the issuance profile's mission_error member
(mission_revoked, mission_expired, or mission_superseded;
[I-D.draft-mcguinness-oauth-mission], Section "Issuance Gating").
A client that requests a fresh grant is refused at the MAS with
mission_not_active (Section 5.4), the authoritative signal
to stop.¶
Deployments whose clients must traverse the authorization code flow
MAY carry the grant in a Pushed Authorization Request [RFC9126] as
the request parameter mission_issuance_grant (Section 13).¶
The AS MUST accept the mission_issuance_grant parameter only in a
pushed authorization request, whether sent directly or inside a
Request Object [RFC9101] pushed there. It MUST reject, with the
invalid_request error code (Section 4.1.2.1 of [RFC6749]), an
authorization request that carries the parameter any other way,
including in a Request Object passed to the authorization endpoint
outside PAR. The front channel then carries only client_id and the
request_uri (Section 4 of [RFC9126]).
This restriction concerns the authorization-request parameter; direct
redemption at the token endpoint (Section 6) is unaffected.¶
The AS applies the grant validation of Section 6.1 at the PAR endpoint and treats the grant as the authorization already obtained. It MUST NOT re-prompt for consent; at most it renders the Mission reference.¶
The AS consumes the grant at PAR validation: the 300-second exp,
iat, and aud checks and the single-use jti check are evaluated
there, and the jti is recorded as seen at that point, so the grant
cannot be replayed into a second authorization request. Recording
there is the atomic issuance step of Section 6.3.4 under this
carriage: from that point the request_uri, and then the
authorization code, carry the authorization. A flow the user abandons,
or the AS refuses, after PAR validation therefore leaves the grant
consumed, and the client obtains a fresh grant.¶
The grant's window is not re-evaluated at code exchange; the issued
authorization code carries its own lifetime from there. All
remaining redemption rules (subset, lifetime, Effective Authority Set
projection, no re-approval, and the error mapping of
Section 6.4) apply at the token request unchanged. A
transient source failure at code exchange refuses
temporarily_unavailable and MUST NOT consume the authorization code,
so the exchange stays retryable within the code's own lifetime.¶
This carriage serves user-delegated Missions
([I-D.draft-mcguinness-oauth-mission], Section "Authority Sources"),
where an authenticated resource owner exists to bind. The AS MUST
bind the resource owner
authenticated at the authorization endpoint to the grant's sub: it
proceeds only where the authenticated user is the grant's Subject
under the deployment's mapping policy (Section 3.2). The AS
MUST refuse when a different user authenticates, so the grant cannot
mint tokens for the wrong resource owner.¶
For a service-owned or organizational Mission there is no delegating
user to authenticate; such a grant is redeemed directly
(Section 6), not carried through the authorization code flow.
The client MUST still be the grant's client_id
(Section 6.1).¶
A MAS that issues grants publishes the following member in its metadata ([I-D.draft-mcguinness-mission-authority-server], Section "Mission Authority Server Metadata"):¶
A consuming AS publishes the following members in its Authorization Server Metadata [RFC8414]:¶
mission_issuance_grant_supported:OPTIONAL. Boolean value; true when the AS redeems Mission Issuance
Grants at its token endpoint (Section 6). If omitted, the
default value is false.¶
mission_issuance_grant_par_supported:OPTIONAL. Boolean value; true when the AS accepts the
mission_issuance_grant parameter in Pushed Authorization Requests
(Section 7). If omitted, the default value is false.¶
The Mandate is evidence; this grant authorizes. Both are
issuer-signed statements about a Mission, and their typ values keep
them apart: the token endpoint refuses a Mandate
(Section 6.1), and a Mandate verifier refuses a grant
([I-D.draft-mcguinness-mission-mandate]).¶
The cross-domain grant is this shape across a trust boundary. Cross-domain projection ([I-D.draft-mcguinness-oauth-mission-cross-domain]) carries a Mission to a Resource AS in another domain, under federation trust and identity chaining. The issuance join is the same-estate case, with bilateral, pre-configured trust (Section 3.2), and requires no identity chaining; a deployment does not use it across domains.¶
Native Mission-aware issuance replaces this grant. An AS that becomes natively Mission-aware implements the issuance profile and mints without grants for its own resources. It consumes the record, anchors, and lifecycle the MAS already operates, so nothing is re-approved in migration.¶
The Mission Join remains for other tokens. Tokens issued under this profile carry the Mission; the estate's other tokens compose through the Mission Join, and the two joins coexist per resource and per AS (Section 3.3).¶
In the substrate's terms ([I-D.draft-mcguinness-mission-substrate]), a MAS alone claims neither Credential-Bound nor Lifecycle-Gated Authorization for tokens its unchanged Authorization Servers issue. Together with its consuming Authorization Servers under this profile, it supplies both, for the resources those servers serve. In the Mission Assurance Levels ([I-D.draft-mcguinness-mission-architecture]), this profile makes Baseline Issuance reachable under the standalone binding, and a consuming AS's refresh gating adds the state-aware half-step.¶
Mission Authority Server implements Section 5 in full:¶
the authenticated endpoint, answering any caller other than the
recorded client with not_found;¶
the active-only gate;¶
subset and audience scoping;¶
derivation counting where a derivation_limit is set;¶
cnf only from a verified sender constraint;¶
minting evidence; and¶
Consuming Authorization Server implements Section 6 in full:¶
grant validation and single use (Section 6.1, Section 6.3.4);¶
token issuance (Section 6.2): mission claim carriage with
authority_hash recorded, subset-bounded authority, the
expires_at cap, and no re-approval;¶
with a Mission-state integration, Effective Authority Set projection at redemption and at every refresh (Section 6.3); without one, no refresh tokens (Section 6.3.6); and¶
the redemption error mapping of Section 6.4.¶
The PAR carriage of Section 7 is OPTIONAL.¶
A deployment claiming this profile states the following alongside its Enforcement Scope Statement ([I-D.draft-mcguinness-mission-runtime], Section "Enforcement Scope and Conformance"):¶
which Authorization Servers consume grants, and which of them have a Mission-state integration;¶
the staleness bound of each one's state gating, and the bound on its Mission Status re-queries (Section 6.3.1);¶
whether each claims containment- or discharge-aware issuance (Section 6.3.6); and¶
its reconciliation posture (Section 11): the window within which minting and redemption logs are reconciled, or that they are not.¶
A consuming AS that supports this profile publishes
mission_issuance_grant_supported, and one that supports the PAR
carriage publishes mission_issuance_grant_par_supported
(Section 8).¶
The security considerations of [RFC7523], [RFC7519], and [RFC8725] apply. This section adds those specific to the issuance join.¶
Grant theft. The grant authorizes issuance, so it is defended in
depth: 300-second lifetime, single-use jti, audience binding to
one AS, redemption bound to the Mission's client_id, and optional
cnf key binding. A stolen grant is useless to any party that cannot
also authenticate as the recorded client, or prove possession of the
cnf key, at the named AS within the window. Deployments whose
client credentials are weak SHOULD require cnf (DPoP [RFC9449] or
mTLS [RFC8705] bindings serve).¶
Mission Issuer compromise reaches issuance. In MAS-only
deployment, MAS compromise corrupts records and state. Under this
profile it additionally mints grants every consuming AS honors:
compromise reaches token issuance across the estate. The consuming
ASs' audit logs of redeemed grants (each with jti, Mission
reference, and authority_hash) are the independent record that
bounds and exposes such
minting.¶
A deployment SHOULD reconcile MAS minting evidence against consuming-AS redemption logs. A deployment SHOULD treat a redemption with no matching minting record as a security event. A deployment states its reconciliation posture in its conformance statement (Section 10). A deployment operating under the Enterprise Mission Authority Profile ([I-D.draft-mcguinness-mission-authority-server]) MUST reconcile within the window its statement declares; at estate scale, reconciliation is the only check on this compromise class.¶
Externally derived authority. The consuming AS accepts authority
derived elsewhere. Its exposure is bounded by the profile's own
rules: it mints only within the grant's authorization_details, only
for the grant's client, never longer than the Mission's expires_at,
and its local policy MAY narrow further. The AS remains free to
refuse any grant its policy distrusts; nothing obliges issuance.¶
Type confusion. Three issuer-signed JWT artifacts describe
Missions: the Mandate (evidence), the cross-domain grant (foreign
domain), and this grant (same estate). Explicit typing with mutually
exclusive validation rules (Section 3.11 of [RFC8725] and
Section 3.12 of [RFC8725]) is the defense: every consumer checks
typ first, and none accepts another's type.¶
Revocation latency. New grants stop at the MAS active gate at
the moment of state commit. A grant already issued can still be
redeemed within its 300 seconds at a consuming AS without a
Mission-state integration. Issued access tokens run to their own
expiry, and an outstanding refresh token is refused at its next
state-gated use; where the runtime layer is deployed, the Policy
Decision Point's
re-check bounds outstanding-token use independently. A refresh
re-projects through
the Effective Authority Set (Section 6.3), so a
Mission contained or discharged between issuance and refresh does
not renew its original, now-narrowed authority. A deployment states
the refresh staleness bound it publishes (Section 10).¶
Consent integrity. The approval the grant rests on was rendered and committed at the Mission Issuer under the issuance profile's rules and, where deployed, Consent Evidence ([I-D.draft-mcguinness-oauth-mission-consent-evidence]). The consuming AS relies on that event and does not substitute a consent of its own: its non-prompting duty (Section 6.2) prevents consent-surface confusion where the Subject holds accounts at both.¶
The grant carries the Mission reference and an authority subset to
the consuming AS, which may be operated by a different organizational
unit than the MAS. Minimization is structural: the MAS scopes
authorization_details to what the audience serves (Section 5),
and nothing else of the record (no purpose text, no Intent, no full
Authority Set) travels. The Mission identifier is a correlator across
MAS and AS logs by design; that correlation is the audit trail, and
deployments that need to limit broader correlation apply the
issuance profile's guidance ([I-D.draft-mcguinness-oauth-mission],
Section "Mission Identifier Correlation").¶
IANA is requested to register one media type per [RFC6838].¶
Type name: application¶
Subtype name: mission-issuance-grant+jwt¶
Required parameters: none¶
Optional parameters: none¶
Encoding considerations: binary; JWS Compact Serialization¶
Security considerations: see Section 11¶
Interoperability considerations: see this document¶
Published specification: this document¶
Applications that use this media type: Mission Authority Servers and OAuth Authorization Servers implementing this profile¶
Fragment identifier considerations: n/a¶
Additional information: n/a¶
Person and email address to contact for further information: see the Authors' Addresses section¶
Intended usage: COMMON¶
Restrictions on usage: none¶
Author: see the Authors' Addresses section¶
Change controller: IETF¶
IANA is requested to register the following in the "OAuth Extensions
Error" registry [RFC6749]. The name is the existing OAuth error code
of Section 4.1.2.1 of [RFC6749], registered only for the
authorization endpoint; this entry adds its token-endpoint use
(Section 6.3.3), as [RFC8628] did for access_denied.¶
This document profiles the JWT authorization grant of RFC 7523 and composes the Mission Authority Server with the issuance profile it already mirrors; it defines no cryptography of its own.¶