| Internet-Draft | Mission GNAP | August 2026 |
| McGuinness | Expires 23 February 2027 | [Page] |
The Grant Negotiation and Authorization Protocol (GNAP) standardized the negotiation the OAuth issuance profile assembles from parts: a grant request delivered by direct post, client instances identified by key with every request signed, a native pending state whose continuation carries asynchronous approval, structured access rights, interaction ceremonies with an integrity-protected finish, and per-token management. It deliberately left the object of that negotiation unspecified: what the resource owner approved persists nowhere as a governed artifact, the grant request is mutable by design, and no lifecycle governs authority already issued when circumstances change. This document supplies that interior from the Mission model of Mission-Bound Authorization for OAuth 2.0. The Mission Intent rides the grant request as a registered member, the interaction ceremony, or a standing basis an adopted companion supplies, is the approval event that creates the Mission record with its integrity anchors, the Mission lifecycle gates every access token issuance and rotation, grant modification is profiled as in-Mission drawdown or Approver-routed expansion, and the continuation access token is Mission continuity that is never authority. This is the fifth binding of the Mission model and the second authored against the Mission Substrate Requirements contract. It is an experimental sketch: the binding's shape and its Mission Substrate Statement are fixed here, and wire-level completeness is deferred.¶
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-mission-gnap.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-mcguinness-mission-gnap/.¶
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 23 February 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.¶
The Grant Negotiation and Authorization Protocol (GNAP) [RFC9635] is a full redesign of delegated authorization around one continuable object: a client instance posts a grant request to the authorization server's grant endpoint, the server negotiates interaction with the resource owner as needed, and the client continues the same grant through an opaque continuation reference until authority is issued, modified, or the grant is finalized. Its companion [RFC9767] standardizes the resource server's contract with that authorization server: RS-facing discovery, token introspection, and a registry of structured token formats.¶
What GNAP deliberately does not standardize is the object at the
center of the negotiation. How the authorization server assesses a
request, what the resource owner approved, in what bounds, with what
durable record, under what lifecycle: all of it is unspecified policy
behind the grant endpoint. The Mission model of
[I-D.draft-mcguinness-oauth-mission] (the "issuance profile") is a
specification of exactly that interior: a durable Mission record
created by an explicit approval event, integrity anchors committing
the approved task and its derived authority, a lifecycle whose
only-active rule gates issuance, and evidence surfaces built on the
record. The issuance profile's own Relationship to GNAP names this
document's premise: the Mission model is the OAuth-native
instantiation of a binding-neutral contextual-governance kernel, and
a deployment that starts from GNAP admits a candidate binding onto
that substrate. This document is that binding.¶
Four mechanics the OAuth binding assembles from parts are native here. The grant request is delivered by direct post by construction, the property the OAuth binding retrofits with pushed authorization requests. Structured authority proposals ride the grant request's native access rights, the intake role Rich Authorization Requests play (Section 5 defines their projection into the family's Authority Set), and every request is signed with the client instance's key, so the proposal is cryptographically attributable. Asynchronous approval is the pending grant state with continuation under the server's declared wait interval, the surface the OAuth binding reaches through the Mission Deferred Approval companion ([I-D.draft-mcguinness-oauth-mission-approval]) over an unratified substrate. And the resource server's contract with the Mission Issuer is standardized by [RFC9767] rather than assembled per deployment. The family has already met this shape once: the Mission Authority Server's lifecycle surfaces follow a reference-plus-continuation pattern that its specification notes parallels GNAP's grant continuation ([I-D.draft-mcguinness-mission-authority-server]); here the parallel is the substrate itself.¶
This is the fifth binding of the Mission model: the issuance profile binds it to the OAuth Authorization Server, the Mission Authority Server to a standalone service beside an unchanged AS, the AAuth binding to the AAuth Person Server ([I-D.draft-mcguinness-mission-aauth]), the UMA binding to the UMA 2.0 authorization server ([I-D.draft-mcguinness-mission-uma]), and this document to the GNAP authorization server. Like the AAuth and UMA bindings, it provides issuance gating structurally: no access token exists without passing the authorization server. It is the second binding authored against the Mission Substrate Requirements contract ([I-D.draft-mcguinness-mission-substrate]); its Mission Substrate Statement (Section 10) is written to that document's conformance rules, and it is the first Statement written in the contract's supplied/not-supplied form with activation conditions.¶
GNAP shares the OAuth binding's flow direction and strengthens it. The client instance's first move is the grant request itself, before any resource is touched, and no front-channel authorization request exists to bypass the push. The model's compile-once property therefore needs only one rule: the first grant request under a prospective Mission carries the whole task as a Mission Intent, and the authorization server derives and obtains approval for the full Authority Set (Section 4). The access tokens requested in that grant request, and in every later modification of it, locate drawdowns within the approved ceiling, not the Mission's extent: the shape the progressive companion names ([I-D.draft-mcguinness-oauth-mission-progressive]), run on GNAP's own negotiation surface (Section 9.3).¶
The tension GNAP adds is the inverse of UMA's. Where the UMA binding had to assemble intent-first behavior on an attempt-first substrate, GNAP's grant request is mutable by design: [RFC9635] lets a client modify a grant while it is approved or pending. The kernel requires the Approved Context to be immutable ([I-D.draft-mcguinness-mission-substrate]). This binding resolves the tension with one split: a modification within the approved Authority Set is a drawdown the authorization server may adjudicate by policy, and a modification beyond it is an expansion that MUST return to the Approver and, on approval, yields a successor Mission (Section 9.3). The grant is the negotiation surface; the Mission record, never the grant, is the approved value.¶
This profile targets deployments that operate a GNAP authorization server implementing [RFC9635] and that route an agent's access through grant requests. The agent is the GNAP client instance; the accountable person is the resource owner. Resource servers participate through [RFC9767] introspection, or validate structured tokens directly, and need no Mission awareness beyond what those surfaces already return (Section 9). Both substrate documents are Proposed Standard RFCs, the only binding in the family whose entire substrate is IETF-ratified; Section 11 discusses what that dependency choice trades.¶
This document is an experimental sketch. It fixes the binding's shape and its Mission Substrate Statement; worked test vectors, a per-surface error taxonomy, and the discovery-field registrations noted in Section 15 are deferred to a later revision.¶
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.¶
All JSON and HTTP shown in this document is non-normative and illustrative; the member definitions in the surrounding text are authoritative.¶
This document uses Mission, Mission Intent, Mission Issuer,
Authority Set, Approver, Subject, mission_id, the integrity
anchors (intent_hash, authority_hash, and, where the Mission
records an authority proposal, proposal_hash), the subset rule, the
only-active rule, and the audit horizon as defined by
[I-D.draft-mcguinness-oauth-mission], and Effective Authority Set
as defined by [I-D.draft-mcguinness-oauth-mission-status]. It uses
authorization server (AS), client instance, instance identifier,
resource owner (RO), end
user, grant request, grant endpoint, access rights, the grant states
(processing, pending, approved, finalized), continuation,
continuation access token, token management, interaction start modes
and finish methods, key proofing methods, and the error codes as
defined by [RFC9635], and RS-facing discovery, token introspection,
and token formats as defined by [RFC9767]. It additionally uses:¶
A GNAP authorization server conforming to this profile: it implements the Mission Issuer role behind its grant endpoint, continuation, token management, and interaction surfaces (Section 12).¶
A GNAP client instance that proposes structured intent on its first grant request under a prospective Mission and respects the Mission lifecycle (Section 12).¶
| GNAP role | Mission model role |
|---|---|
| Authorization server | Mission Issuer: runs the assessment, holds the Mission record, gates every token issuance and rotation, serves Mission state |
| Client instance | Agent: the Actor, identified by its instance identifier or a stable key-derived identifier; its requests are key-proved (Section 7) |
| Resource owner | Candidate Approver, and authority source where the assessment consumes its standing authority |
| End user | The interacting operator; no Mission role follows automatically |
| Resource server | Resource Server: [RFC9767] participant or structured-token validator, no Mission awareness required |
The Subject is not a wire role. It is the issuer-qualified principal
on whose behalf the Mission runs, established by the authorization
server under the issuance profile's authority-source rules and
recorded with the Mission: often the resource owner, and in GNAP's
cross-user flows (an operator working a client on a customer's
behalf) it follows the authority source, not the operator. The grant
request's user member is an unauthenticated hint and never
establishes it (Section 6).¶
Two properties of this mapping are structural in GNAP rather than profile rules. First, the proposer is never the approver on the wire: the client instance can only request, and every grant of authority is decided at the authorization server. Second, the pending grant with continuation makes the human Approver's asynchronous decision native rather than a companion overlay (Section 6).¶
In the agent deployments this profile targets, one natural person commonly operates the client, owns the resources, and is the principal the Mission serves: operator, Approver, and Subject coincide, the OAuth binding's default geometry. The table's role assignments, not that coincidence, are normative.¶
This section is informative. An agent holds the task "reconcile Q3
invoices at the finance service and file the summary at the document
service" for Alice, whose resources at both services are governed by
the authorization server at https://as.example.com/gnap.¶
The agent posts a grant request to the grant endpoint, signed
with its instance key: a mission_intent member carrying the
whole task (Section 4), access token requests whose
access arrays name both services (the authority proposal), and
an interact member offering redirect start with a redirect
finish.¶
The authorization server validates the Intent as untrusted input,
derives the full Authority Set, and returns a pending response:
a continue object with a continuation access token bound to the
agent's key, and interaction instructions for Alice.¶
Alice authenticates at the authorization server's interaction
surface, reviews the rendered task and derived Authority Set, and
approves. The Mission record is created active, the anchors are
committed, and Consent Evidence is recorded (Section 6).¶
The interaction finish returns Alice's browser to the agent's
callback with an interaction reference, integrity-bound by the
finish hash. The agent continues the grant with interact_ref;
the grant reaches approved, and the response carries the
finance-service access token, the first drawdown of the approved
ceiling, plus the Mission Reference in the mission response
member (Section 9.1).¶
Later the agent needs the document service. It modifies the grant with a request for that service's access. The requested rights are within the Authority Set, so the authorization server approves by policy without waking Alice and issues the second token: a drawdown, not a new approval (Section 9.3).¶
Each resource server introspects tokens per [RFC9767], or
validates the structured token's mission claim offline.
Revoking the Mission at the authorization server finalizes the
grant and takes effect at the next introspection everywhere: one
Mission, compiled once, drawn down per service, killed in one
place.¶
The Mission Intent reaches the authorization server inside the grant
request: a mission_intent top-level member, registered for the
GNAP Grant Request Parameters registry (Section 15). This binding
defines no new endpoint; the grant endpoint is the intake.¶
The mission_intent value is a Mission Intent Submission envelope
as the issuance profile defines it, intent plus OPTIONAL
evidence, under that profile's syntactic and Intent Submission
Evidence rules (the envelope and the Intent are both closed at the
top level, the authorization server MUST bound size, array lengths,
evidence entry count, and evidence verification cost, presented
evidence is dispatched by type and refused when unsupported or
failing, and the submission is untrusted client input, never
authority). The grant request's signature attributes the submission
to the client instance's key; attribution confers no authority.¶
The access rights of the grant request's access token requests are
this binding's authority proposal, replacing the issuance profile's
PAR-only carriage rule. GNAP rights are not an OAuth
authorization_details array: Section 5 defines the
normative projection that resolves, normalizes, and aggregates them
before the issuance profile's recording and hashing semantics apply
(a proposal, never authority; the Intent itself carries no authority
members).¶
A Mission-Bound GNAP Client Instance MUST carry the Mission Intent
on the first grant request it makes under a prospective Mission, and
the Intent MUST describe the whole task, not the slice the request's
access rights name. The authorization server derives the Authority
Set from the Intent, and from the authority proposal, bounded by the
issuance profile's Mission Authority rules; the requested access
locates the first drawdown, not the Mission's extent
(Section 1.1). The mission_intent member is valid only on the
grant request that opens the negotiation (Section 6.2). A grant
request with no mission_intent and no
Mission association is plain GNAP, outside this profile's scope.¶
The Subject arrives through GNAP's own channels: interaction at the
authorization server, or subject assertions the server verifies. The
authorization server MUST NOT take the Subject from the grant
request's user member or from the Mission Intent, which are
unauthenticated client input (Section 6).¶
The proposal is the shaping profile's Mission Intent proposal, and a deployment that shapes free-text instructions into structured Intents composes here unchanged ([I-D.draft-mcguinness-mission-shaping]).¶
GNAP's grant processing is this binding's approval surface. Where processing concludes that a new Mission is proposed, it executes the issuance profile's approval steps:¶
Authenticate the Approver: the resource owner or other
accountable principal at the authorization server's interaction
surface, or establish the standing basis of an adopted companion
profile (Section 6.1). When
the Intent carries controls.acr, the authentication MUST be one
the deployment's policy maps as satisfying the named class.¶
Establish the Subject: the issuer-qualified principal on whose
behalf the Mission runs, per the deployment's authority-source
policy (Section 2), from interaction the
authorization server itself conducted or from subject assertions
it verified, never from the grant request's user member, the
Mission Intent, or other unauthenticated client input.¶
Derive the Authority Set from the Intent and the authority proposal (Section 4), and render it for consent on the interaction surface under the issuance profile's rendering rules (Section 13.3).¶
Compute the integrity anchors with the authorization server's
grant endpoint URI as the envelope iss (Section 7).¶
Create the Mission record in the active state atomically with
the approval decision. The grant request MUST NOT reach the
approved state under the Mission before the record is active.¶
Three native processing outcomes realize the approval event:¶
Interactive owner decision. The authorization server directs the
resource owner through an interaction start mode (redirect, app,
user_code, or user_code_uri), and the decision is made on the
server's own surface. Where a finish method is used, the interaction
hash of [RFC9635] binds the client's nonce, the server's nonce,
the interaction reference, and the grant endpoint URI, and the
client instance MUST verify it before continuing
(Section 13.2).¶
Deferred decision. Where no finish method is used, or the owner
decides on their own schedule, the grant rests in pending: the
client instance polls the continuation URI under the server's
declared wait interval, and the rotating continuation access token
is the deferral handle (Section 13.1). This is the
surface the OAuth binding needs the Mission Deferred Approval
companion for ([I-D.draft-mcguinness-oauth-mission-approval]);
here it is the substrate's ratified machinery, and that companion
does not apply.¶
Standing basis. A policy is not the Approver. A grant the
authorization server would approve without interaction creates a
Mission only where an adopted profile supplies the complete
approval_basis the issuance profile defines (type, consent
principal, root commitment, activation, and activation actor),
tracing the machine-speed activation to an accountable human
consent; the family's Mission Templates profile is that shape. The
GNAP policy identifier and version are activation context, never the
Approver. Absent such a profile, noninteractive processing MUST NOT
create a Mission: baseline Mission creation under this binding is
interactive or deferred.¶
The negotiation loop is the clarification and narrowing surface: the
owner or the authorization server may narrow the proposal across
interaction rounds while the grant rests in pending, and a denial
that leaves the grant continuable rides the error-with-continue
response of [RFC9635]. That loop is most of the state machine the
approval-revision companion defines, native to the substrate
([I-D.draft-mcguinness-oauth-mission-approval-revision]); where a
deployment adopts that companion's semantics, the continuation URI
is its revision handle.¶
Mission Consent Evidence composes unchanged, with the authorization server as the committing issuer ([I-D.draft-mcguinness-oauth-mission-consent-evidence]): the interaction surface is where the disclosure is rendered, and what was shown is what the evidence commits.¶
A grant under a prospective Mission is mutable until approval, and
the ceremony must bind what was actually approved. The authorization
server MUST maintain a proposal revision for the grant: every
modification that changes what rendering depends on (the access
token requests, the subject request, user assertions, or the
interaction arrangement) increments it. Rendering, the approval
decision, the interaction reference, Consent Evidence, and the
anchors MUST all bind the same revision, and an interaction
completion presented for a stale revision MUST NOT approve a later
one: the authorization server refuses it (invalid_interaction) and
re-renders. The anchors are computed over the revision actually
approved.¶
The mission_intent member is valid only on the grant request that
opens the negotiation; the authorization server MUST reject a
modification that carries it (invalid_request). After activation,
modification is adjudicated per Section 9.3, and the Approved
Context is never revised behind the existing reference.¶
GNAP has no native artifact for what was approved; the grant request
is mutable and the states carry no content. The Mission record
supplies it. A Mission-Bound GNAP Authorization Server MUST create a
Mission record, as the issuance profile's Mission Record section
defines it, for every Mission it approves, with issuer its grant
endpoint URI (the value [RFC9635] defines as the identifier of the
AS) and client_id the client instance's instance identifier where
the authorization server registers one, or a stable approval-time
identifier it derives from the instance's key where none is
registered. That value is the Actor identity; token presenter keys
are credential bindings recorded separately
(Section 13.4).
expires_at is REQUIRED, in RFC 3339 [RFC3339] date-time form;
when the proposal's Intent carries none, the authorization server
MUST set one by policy.¶
Like the UMA binding and unlike the AAuth binding, this substrate
carries no wire-native mission artifact to commit. The record is
held at the authorization server, mission_id and issuer name the
Mission, and consumers meet the reference in the mission grant
response member, the token's mission claim, or the introspection
response (Section 9). No substrate-native commitment exists
beside the anchors, and nothing substitutes for them.¶
The Mission lifecycle is the issuance profile's state space,
extended by the status profile where the deployment adopts it
([I-D.draft-mcguinness-oauth-mission-status]), with the
only-active rule governing every authorization-server surface and
unrecognized states fail-safe non-active.¶
| Family state | GNAP surface |
|---|---|
active
|
continuation, token issuance, and rotation served; introspection reports tokens by their own status |
completed
|
grant finalized; continuation refused (invalid_continuation); rotation refused (invalid_rotation); introspection reports active: false
|
revoked
|
grant finalized; continuation refused (invalid_continuation); rotation refused (invalid_rotation); introspection reports active: false
|
expired
|
grant finalized; continuation refused (invalid_continuation); rotation refused (invalid_rotation); introspection reports active: false
|
suspended
|
continuation defers: a continue object with wait and no new tokens; rotation refused (invalid_rotation); introspection reports active: false
|
The projection is fail-safe: every non-active state projects to a
non-permitting native signal. The introspection projection is
binary: a response for a token under a non-active Mission is
active: false with every other member omitted, per [RFC9767],
the mission member appears only in active responses
(Section 9.1), and the lifecycle reason is obtained from the
family state surfaces (Section 8.2). This binding adds to
GNAP's model:¶
Revocation. The authorization server MUST provide an
authenticated means for the Subject, the Approver, or an
administrator to revoke a Mission by mission_id, independent of
any token and of the grant's continuation, per the issuance
profile. On revocation the authorization server finalizes the
grant and treats the Mission's outstanding tokens as inactive at
introspection; a deployment that validates structured tokens
without introspection needs the state surfaces below.¶
Expiry. When the record's expires_at passes, the Mission
transitions to expired without a request.¶
Completion. The client instance's DELETE of the continuation
URI is grant cancellation: it always finalizes the grant, per
[RFC9635]. A Mission-Bound GNAP Authorization Server MAY
additionally treat it as a completion proposal, adjudicated under
the Issuer's lifecycle policy with the semantics of the status
profile's complete operation; a rejected or unauthorized
proposal leaves the grant finalized without changing Mission
state. A deployment MAY also serve completion as a family surface
for parties other than the client.¶
Suspension. A deployment that adopts the status profile's
suspended state defers rather than denies: continuation
responses carry continue with wait and no new tokens, so the
client instance waits under GNAP's own retry discipline rather
than treating the Mission as dead.¶
The grant and the Mission have distinct lifetimes. A Mission-Bound
GNAP Authorization Server SHOULD keep the grant continuable
(returning a continue object) while the Mission is active, so
the negotiation surface tracks the Mission; a grant the server
finalizes early ends negotiation but not governance of tokens
already issued. Re-attaching a new grant request to an existing
Mission is deferred work.¶
No access token exists without the authorization server, so issuance
gating is structural, as it is at the AAuth Person Server and the
UMA authorization server. On that precondition the authorization
server MUST NOT issue an access token, honor a grant modification,
or rotate a token's value or key under a Mission that is not
active, and the active check MUST be atomic with the operation.
One derivation is counted per successful GNAP operation that issues
or rotates credentials under the Mission (an initial grant response,
a continuation response, a modifying request's response, or a token
rotation), regardless of the number of tokens the response carries;
an operation that issues none counts zero. Where the Intent's
controls.max_derivations is
present, the authorization server MUST refuse the derivation that
would exceed it, per the issuance profile's count-and-gate rule. An
access token issued under a Mission MUST NOT expire later than the
Mission's expires_at, so no credential outlives the Mission.¶
Where the deployment adopts Mission Containment
([I-D.draft-mcguinness-oauth-mission-containment]), the
authorization server MUST intersect every issued token's access
rights, including rights carried in a grant from before a contain
transition, with the Mission's current Effective Authority Set
([I-D.draft-mcguinness-oauth-mission-status]) at every issuance
and every modification. The intersection runs at access-right grain:
the authorization server removes every right the Effective Authority
Set no longer grants, and refuses the request (request_denied)
when no right survives. Because rotation preserves a token's rights
by definition in [RFC9635], the authorization server MUST refuse
rotation (invalid_rotation) for a token whose rights are no longer
within the Effective Authority Set; the client instance's recourse
is a grant modification, which is adjudicated against the current
set. Carriage of the containment profile's registered denial reason
on GNAP's error object is deferred wire work (Section 11).¶
Per-use introspection is this binding's native state source for
resource servers. A response for a token under an active Mission
carries the mission member with its state (Section 9.1)
and, under Containment, an access array filtered to the Effective
Authority Set at access-right grain. [RFC9767] evaluates activity
in the resource server's context: where the introspection request
named minimum access rights and the filtered set no longer
satisfies them, the token is inactive in that context and the
response is active: false with every other member omitted. Where
no minimum was named, an otherwise valid token reports
active: true with the filtered, possibly empty, access array:
the resource server then holds no disclosed authority to permit.
mission.state continues to report active because containment
narrows authority without changing Mission state. The staleness
bound is the introspection caching the deployment permits, which the
deployment MUST state; with caching disabled the bound is
effectively zero.¶
A deployment whose tokens are structured formats validated without introspection loses that source, and MUST either cap token lifetime at its declared staleness bound (lifetime-bounded reliance) or serve an active state surface. A Mission-Bound GNAP Authorization Server SHOULD serve the Mission Status operation of [I-D.draft-mcguinness-oauth-mission-status], with its signed responses, authentication, anti-oracle property, and caching rules, and MAY emit Mission Lifecycle Signals ([I-D.draft-mcguinness-oauth-mission-signals]) as the transmitting Mission Issuer. A deployment claiming runtime enforcement of the high-consequence classes MUST provide an active freshness source with a published staleness bound ([I-D.draft-mcguinness-mission-runtime]); per-use introspection with a stated cache bound satisfies it, and token lifetime alone does not.¶
An authorization server that serves these surfaces advertises the
corresponding members (mission_status_endpoint,
mission_status_signing_alg_values_supported,
mission_lifecycle_endpoint, mission_event_stream_endpoint,
mission_max_stale_seconds) in its discovery responses: the
client-facing OPTIONS discovery of [RFC9635] and the RS-facing
discovery document of [RFC9767], with the semantics those family
profiles define. GNAP defines no client-facing key publication
surface, so the verification keys for signed family artifacts are
distributed by deployment configuration or an RS-facing discovery
extension; registration of these discovery fields is deferred work
(Section 15).¶
The GNAP access token is this binding's Mission-bound credential. It
is bound to the client instance's key by default under [RFC9635];
a deployment that sets the bearer flag on a Mission-bound token
weakens the holder guarantee and MUST declare that mode in its
Mission Deployment Profile.¶
An access token issued under a Mission names it through the
mission object: the family members id, issuer, and
authority_hash as the issuance profile defines them, and it SHOULD
carry the record's expires_at, a bounding commitment with no
liveness that the token's own expiry already sits inside
(Section 8.1). The object is delivered on
three carriage surfaces:¶
Token-carried: a deployment issuing structured tokens (for
example the jwt-signed format of [RFC9767]) carries the
issuance profile's registered mission JWT claim in the token.¶
Introspection-carried: a deployment issuing opaque tokens
carries the same object, with the state member per the issuance
profile's introspection section, in a mission member of the
[RFC9767] introspection response, beside access, on active
responses only (Section 8, Section 15).¶
Grant-response-carried: the grant response carries a mission
member (Section 15) giving the client instance the Mission
Reference, expires_at, and current state. This surface informs
the Actor; it is correlation for the client, never proof for a
resource server.¶
A token-carried claim verifies offline under keys the deployment
distributes; an introspection-carried claim is asserted by the
authorization server over the mutually authenticated introspection
exchange at each use. In both, the Mission reference arrives through
token validation itself, so the runtime profile's binding
establishment composes credential-carried with no join
(Section 10). A consumer MUST NOT use any mission
member to grant or widen authority, per the issuance profile.¶
The access rights a token carries MUST be a subset of the Mission's Authority Set under the issuance profile's subset rule, evaluated through the authority adapter (Section 5): each right maps to its type's canonical authorization-detail form and is compared in the type's declared value space. Unknown types, unresolved references, or incomparable members fail closed at the decision point that requires their semantics, and an exact-carry type is satisfied only by the exact right at its original audience. Where the deployment adopts Mission Containment, Section 8.1 states the set a token is gated against at issuance and modification.¶
The grain is finer than UMA's resource-and-scopes projection: a type-qualified rights object can carry parameter bounds the family's Authority Set expresses, where its type defines them. What it still cannot carry is cumulative consumption: the metering companion's budgets ([I-D.draft-mcguinness-mission-metering]) and cross-action constraints bind at the runtime layer, where the PDP evaluates each consequential action against the full Authority Set ([I-D.draft-mcguinness-mission-runtime], [I-D.draft-mcguinness-mission-authzen]); the substrate swap leaves that layer untouched (Section 11).¶
The approved Authority Set is a pre-consented ceiling, and each token issuance is a drawdown within it: the model the progressive companion defines for the OAuth binding ([I-D.draft-mcguinness-oauth-mission-progressive]), run natively on GNAP's grant modification. When the client instance modifies the grant with requested rights within the Authority Set, the authorization server MAY approve by policy without waking the Approver: that adjudication is a drawdown, not a new approval, and the anchors do not change. Modification never alters previously issued tokens, per [RFC9635]; each newly issued token is a fresh derivation gated per Section 8.1.¶
A requested right outside the Authority Set is an expansion, not a drawdown. The authorization server MUST NOT widen by policy: it routes the modification to the Approver through interaction or the pending deferral, and an approval creates a successor Mission under the expansion companion's semantics ([I-D.draft-mcguinness-oauth-mission-expansion]), atomically associating the grant with the successor. The predecessor record and its anchors are never rewritten, and previously issued tokens retain the predecessor's Mission reference. The wire needs nothing new: widening is another negotiation round the owner must decide.¶
The continuation access token is GNAP's continuity artifact: it is bound to the client instance's key, rotated by the authorization server across continuation responses, and usable only to continue, modify, or revoke the grant. It grants no resource access, and this binding keeps it that way: the authorization server MUST NOT accept a continuation or token management access token for resource access or as evidence of Mission authority. That is the family's session-continuity discipline (continuity is never authority, as the harness profile enforces for agent sessions ([I-D.draft-mcguinness-mission-harness])), pre-enforced by the substrate's own design. The continuation URI and its token are the Mission's negotiation handle: a later drawdown or completion proposal rides them without the client re-pushing the Intent.¶
Continuity is never authority. Continuation possession MUST NOT substitute for Mission state, for the subset check, or for any approval; a continuation request under a non-active Mission yields the non-permitting outcome of Section 8, and holding the continuation never widens what assessment would grant without it.¶
The introspection response for the finance-service token of Section 3, while the Mission is active:¶
{
"active": true,
"iss": "https://as.example.com/gnap",
"access": [
{
"type": "finance-ledger",
"actions": ["read", "post-adjustments"],
"locations": ["https://finance.example.com/q3"]
}
],
"key": {
"proof": "httpsig",
"jwk": {
"kty": "OKP",
"crv": "Ed25519",
"x": "JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw3c5D0bs"
}
},
"exp": 1793610000,
"mission": {
"id": "msn_9Fk2WqLp0Vd5Jh8xTc4nB7r1",
"issuer": "https://as.example.com/gnap",
"authority_hash":
"sha-256:x8FvWqLp0Vd5Jh2mTc4nB7r1KdYzQw6aA3f5EMkRb60",
"expires_at": "2026-12-31T23:59:59Z",
"state": "active"
}
}
¶
The active, iss, access, and key members are [RFC9767]'s,
unchanged; the mission member is this binding's introspection
carriage of the issuance profile's object (Section 9.1). The
access array is the projection of the Mission's Authority Set
entries for this token; a consumption budget on post-adjustments
does not appear, because it binds at the runtime layer (Section 9.2).¶
This section is this binding's Mission Substrate Statement ([I-D.draft-mcguinness-mission-substrate]). It applies to this revision of the binding in token-carried, introspection-carried, and mixed credential modes.¶
The contextual-governance kernel maps as follows:¶
Mission Reference: the tuple (issuer, mission_id) names
one record. issuer is the grant endpoint URI, the identifier of
the AS under [RFC9635]; mission_id follows the issuance
profile's uniqueness, retention, comparison, non-reassignment,
and entropy rules (Section 7).¶
Controller: the GNAP authorization server controls approval, state, assessment, and token issuance. Relying components establish it from the configured trust in its grant endpoint URI; resource servers locate its introspection surface through RS-facing discovery ([RFC9767]), and verification keys for signed family artifacts are deployment-distributed (Section 8.2).¶
Actor binding: the Actor is the client instance, identified by its instance identifier where the authorization server registers one, otherwise by a stable approval-time identifier the Controller derives from the instance's key. Instance requests are proved by the key proofing method on every signed request; at approval the Controller binds the instance that signed the negotiation-opening request. Access-token presenter keys are credential bindings recorded separately: token key rotation is a credential event, never Actor succession, and client-instance identity migration is outside [RFC9635], requiring a deployment-authenticated rule or a fresh approval. Delegation is not defined by this binding (Section 2, Section 7, Section 13.4).¶
Approved Context: the immutable Mission Intent, the recorded
authority proposal (the adapter's canonical array,
Section 5), and the derived Authority Set in the
Mission record are the Approved Context. The family
intent_hash, authority_hash, and proposal_hash commit them
under the issuance profile's canonicalization; they are this
binding's chosen mechanism, not a substrate-kernel requirement.
The mutable grant request is never the approved value, and
modification never revises the record behind its reference:
approved widening yields a successor Mission (Section 1.1,
Section 7, Section 9.3).¶
Approval ceremony: grant processing performs the five
approval steps in the interactive or deferred mode, or under a
companion-supplied standing basis, binding one proposal revision,
and creates the record active atomically with approval;
the grant does not reach approved before the record does
(Section 6, Section 6.2).¶
Governance gate: only the issuance profile's active state
is active. Every other or unrecognized value fails closed at
continuation, issuance, rotation, and the introspection
projection. The Subject, Approver, and administrator have an
authenticated revocation path (Section 8, Section 8.1).¶
Reliance bound: issuance, modification, and rotation
establish active at the authorization server. An opaque token
is bounded by authenticated per-use introspection; a structured
token without a state check remains usable only for its bounded
lifetime, capped at the Mission's expires_at, after a
transition (Section 8.1, Section 8.2).¶
Context propagation: the protected mission claim in a
structured token proves issuance under the Mission and verifies
offline; the mission member of the introspection response (on
active responses only) is
the Controller's authenticated per-use assertion of the same
fact and current state; the mission grant response member is
correlation for the client instance only. The continuation
access token carries continuity and never establishes Mission
governance or authority (Section 9.1, Section 9.4).¶
Governance record: the assessment log is the ordered governance record. The authorization server MUST append approval, positive and negative Mission-dependent decisions (issuance, modification, rotation, introspection projections it relies on), and lifecycle transitions in per-Mission append order; MUST protect the log under the same integrity and access controls as the Mission record; and MUST retain both for the deployment-declared audit horizon.¶
The binding declares these capabilities:¶
| Capability | Claim | Activation | Scope and defining sections | Limitations |
|---|---|---|---|---|
| Lifecycle-Gated Authorization | supplied | always | Token issuance, grant modification, and token rotation at the AS (Section 8.1) | A structured token without a state check remains usable only for its bounded lifetime |
| State-Observable | supplied | [RFC9767] introspection deployed, or Mission Status active | Resource servers via per-use introspection with a declared cache bound; any authorized consumer via Mission Status (Section 8.2) | Token lifetime alone is not observation |
| Structured Authority | supplied | always | Access rights admitted through the authority adapter; the AS owns each supported type's semantics; comparison in the type's declared value space (Section 5, Section 9.2) | Unsupported types refuse at intake; exact-carry types compare by equality only; consumption bounds bind at the runtime layer |
| Monotonic Derivation | supplied | always | The no-broader-than relation of adapter-supported types at issuance, modification adjudication, and rotation refusal (Section 9.2, Section 9.3, Section 8.1) | Exact-carry types classify exact matches or refuse; covers this issuer's boundary |
| Credential-Bound | supplied | always | Key-bound token with a protected mission claim, or the authenticated introspection assertion; fact semantics: lifecycle-gated issuance (Section 9.1) |
Introspection carriage is an online issuer assertion; a bearer-flagged token weakens holder proof |
| Authorized Context Correlation | not supplied | -- | -- | The Controller binds Mission, Actor, Subject, and tokens natively; no cross-authority join is defined |
| Independently Verifiable | supplied | structured token format issued, or signed Mission Status active | Offline verification of issuance-under-Mission and of state as of a signed observation (Section 9.1, Section 8.2) | Key distribution is deployment-configured; GNAP publishes no client-facing key surface |
| Portable Evidence | supplied | Consent Evidence, Mission Mandate, or Audit Transparency active | The adopted profile's artifact and verification procedure | The base assessment log is Controller-local |
Each supplied row's temporal elements inherit the reliance floor of
Section 8.1 unless stated: freshness at use is established at the
gated operation or at introspection, artifact lifetime is the
token's expiry capped by the Mission's expires_at, and the
residual interval after the Mission becomes non-active is the
remaining lifetime of structured tokens or the declared
introspection cache bound. Failure behavior is uniformly
fail-closed: absent, stale, unknown, incomparable, invalid, or
unavailable input refuses the gated operation. The Portable Evidence
row is supplied only while its activation profile
([I-D.draft-mcguinness-oauth-mission-consent-evidence],
[I-D.draft-mcguinness-mission-mandate],
[I-D.draft-mcguinness-mission-audit]) is adopted; the referenced
profile defines the portable artifact and verification procedure.¶
The composition consequences:¶
The runtime profile and its AuthZEN binding compose against either credential surface: the Mission reference arrives through token validation (structured token claims, or the issuer's introspection response that validates the opaque token), so binding establishment is credential-carried in both (Section 9.1).¶
Shaping, consent evidence, status and signals, the Mandate, and audit transparency ([I-D.draft-mcguinness-mission-audit]) compose unchanged, with the authorization server as the Mission Issuer, committing issuer, minter, and transmitter those profiles name.¶
Child delegation does not apply as profiled: its request wire is OAuth-bound ([I-D.draft-mcguinness-oauth-mission-child-delegation]), and this binding defines no actor chain. A sub-agent operates as its own client instance under its own grant requests; GNAP-native Child Mission creation is deferred work.¶
Offline attenuation does not apply as profiled: every token is issuer-minted ([I-D.draft-mcguinness-oauth-mission-attenuation]). A deployment issuing attenuable token formats from the [RFC9767] registry (macaroon, biscuit, zcap) takes on that companion's obligations; profiling that composition is deferred work.¶
Cross-domain projection is not provided: GNAP federates a resource server to an authorization server, not one Mission Issuer to another, so projecting a Mission into a foreign issuer remains the cross-domain companion's OAuth-bound mechanism ([I-D.draft-mcguinness-oauth-mission-cross-domain]). One Mission natively governs many resource servers within the authorization server's own trust domain, the multi-service case the flow shows (Section 3).¶
Mission Containment composes at issuance, modification, rotation refusal, and per-use introspection filtering ([I-D.draft-mcguinness-oauth-mission-containment], Section 8.1, Section 8.2).¶
The family's Mission Assurance Levels layer on top unchanged ([I-D.draft-mcguinness-mission-architecture]); a deployment states its level, binding, state sources, and staleness bounds in its Mission Deployment Profile.¶
Deployed base. Both substrate documents are Proposed Standard RFCs, so this binding is the family's only one whose entire substrate is IETF-ratified. What GNAP lacks is deployed breadth. The issuance profile's Relationship to GNAP states the composition posture this document inherits: the family composes with deployed grant protocols rather than requiring new ones, so this binding governs estates that already run GNAP; it does not create them, and a deployment without a GNAP substrate has no reason to adopt one for the Mission's sake, since the OAuth binding exists.¶
Mutability discipline. The grant request is mutable by design, and this binding's drawdown/expansion split (Section 9.3) is the load-bearing rule that keeps the Approved Context immutable behind it. An implementation that lets policy adjudication of a modification widen authority, or that treats the negotiated grant as the approved value, has silently replaced the approval; the Mission record and its anchors, never the grant, are what was approved.¶
Deferred wire work. Beyond test vectors and the error taxonomy, this sketch defers: carriage of the containment profile's denial reason on GNAP's error object; registration of the family discovery members for both GNAP discovery surfaces; re-attaching a new grant request to an existing Mission after finalization; client-instance identity migration; GNAP-native Child Missions; and the attenuable-token-format composition (Section 10).¶
An implementation conforms in one of two roles. Resource servers participate through unmodified [RFC9767] or structured-token validation and have no role to claim.¶
A Mission-Bound GNAP Authorization Server:¶
accepts the mission_intent grant request member on
negotiation-opening requests only, and bounds it as
untrusted input (Section 4, Section 6.2);¶
projects access rights into the family representation through the
authority adapter: resolves references, refuses unsupported types,
aggregates and deduplicates across token requests, and records the
canonical array as proposed_authority (Section 5);¶
executes the approval event on its grant processing surface in the
interactive and deferred modes, and in the standing-basis mode
only where an adopted profile supplies the complete approval
basis, binding one proposal revision, creating the
record active atomically with the decision, and computing the
anchors (Section 6, Section 6.2, Section 7);¶
operates the lifecycle of Section 8: authenticated revocation
by mission_id, expiry, completion adjudicated on grant
revocation, fail-safe
projection onto continuation and token-management outcomes, and
the only-active gate atomic with every issuance, modification,
and rotation (Section 8.1);¶
issues access tokens as Mission-bound credentials on a declared carriage surface, applies the subset rule at every issuance and modification, and routes out-of-set modifications to the Approver, realizing approved widening as a successor Mission (Section 9, Section 9.3);¶
where it adopts Mission Containment, intersects every issued
token's rights with the Effective Authority Set at access-right
grain at every issuance and modification, refuses a result with no
surviving right (request_denied), refuses rotation of a token
whose rights the set no longer covers (invalid_rotation), and
filters per-use introspection the same way, reporting
active: false where a named minimum access is no longer
satisfied and the filtered access array otherwise
(Section 8.1, Section 8.2);¶
treats token key rotation as a credential event, never Actor succession (Section 13.4);¶
keeps continuation and token management access tokens confined to their surfaces, as continuity, never authority (Section 9.4);¶
serves Mission state with a declared staleness bound per Section 8.2, and retains the record and assessment log for the audit horizon; and¶
advertises its Mission surfaces in its discovery responses (Section 8.2).¶
A Mission-Bound GNAP Client Instance:¶
carries a whole-task Mission Intent on the first grant request under a prospective Mission, and treats every proposal as a proposal, never as authority (Section 4);¶
follows GNAP's continuation discipline: respects wait, verifies
the interaction finish hash before continuing, and stops on a
finalized grant;¶
holds the continuation access token as continuity and never treats
it, the token management token, or mission_id as a credential
(Section 9.4); and¶
proposes completion by revoking the grant request when the task is done, understanding that revocation finalizes the grant and completion is the Issuer's adjudication (Section 8).¶
Between the pending response and the owner's decision, the continuation access token is the artifact binding the client instance to the pending approval: the role the deferral code plays in the Mission Deferred Approval companion and the rotating ticket plays in the UMA binding. GNAP's protections (the token is bound to the client instance's key, presented only over signed requests, and rotated across continuation responses) are load-bearing for the approval's integrity, and an authorization server MUST maintain them across the negotiation. A continuation accepted without key proof would let a stale or hijacked exchange complete against a decision the owner made about a different pending state.¶
Where a finish method is used, the interaction hash binds the
client's nonce, the server's nonce, the interaction reference, and
the grant endpoint URI. The client instance MUST verify it before
presenting interact_ref, and the authorization server MUST reject
a reference that fails its own integrity checks, per [RFC9635].
For this binding the hash is not an optimization: it is what
prevents an attacker from splicing a victim's approval onto the
attacker's grant, the approval-substitution attack the family's
security model names ([I-D.draft-mcguinness-mission-security-model]).¶
The Mission Intent, its goal text, and every justification are attacker-influenceable input rendered on the interaction surface. The issuance profile's rendering rules apply unchanged: render client text inert and sanitized, mitigate direction-override and confusable-character presentation, and keep the derived Authority Set visually distinct from client-supplied narrative, so crafted text cannot pass as derived authority.¶
The Actor is the client instance (Section 2); an access token's key
is a credential binding, and the two must not be conflated: GNAP
tokens can be bound to a different key than the instance's, to an
AS-provided key, or carry the bearer flag. [RFC9635] permits
rotating a token's key only under dual proof of the old and new
keys, and defines no modification of client-instance keys. A
Mission-Bound GNAP Authorization Server MUST record an accepted
token key rotation in the governance record as a credential event,
MUST NOT treat it as Actor succession or rewrite the Mission's Actor
binding, and refuses a rotation it cannot attribute to the bound
Actor (key_rotation_not_supported). Client-instance identity
migration is outside [RFC9635]: a deployment defines an
authenticated migration rule or requires a fresh approval; silent
key succession would let a compromised instance walk the Mission to
an attacker-held key.¶
A compromised authorization server is a compromised Mission Issuer: forged approvals, arbitrary tokens, false state ([I-D.draft-mcguinness-mission-security-model]). GNAP concentrates approval, issuance, introspection, and the interaction surface in one service, so the security model's concentration analysis for the OAuth binding applies in full. Consent evidence and audit transparency make forgery detectable after the fact; they do not prevent it.¶
Where opaque tokens make introspection the Mission and state channel, the exchange's mutual authentication (the resource server signs with its own key and the response is the issuer's assertion) and its caching policy carry this binding's freshness claims. A resource server that caches introspection responses beyond the deployment's declared staleness bound turns fail-closed rules fail-open in effect; a deployment MUST size cache bounds to what its Mission Deployment Profile claims. Structured tokens move the same weight onto token lifetime (Section 8.2).¶
The task concentrates at the authorization server. The whole-task Intent rule sends the full task description to the authorization server in the first grant request, earlier and more completely than per-service negotiation would. That is deliberate, and it is the concentration the issuance profile's record already implies; the shaping profile's minimization guidance applies to what the Intent says.¶
Resource servers see little. Introspection returns a resource
server only the token's access rights and the mission members; the
Intent, the constraints, and the rest of the Authority Set stay at
the authorization server, and [RFC9767] already prohibits echoing
the token value. Subject information is released only in the formats
and identifiers requested and authorized, per [RFC9635].¶
mission_id is a correlation handle. The mission members
correlate one Mission's activity across resource servers and across
tokens, the issuance profile's deliberate stable-anchor property;
that profile's guidance applies. The mission grant response member
adds correlation at the client instance only, and nothing new
crosses to resource servers.¶
This document registers two GNAP extension members and one introspection response member; the behavior fixed here is the registration content.¶
GNAP Grant Request Parameters registry ([RFC9635]):¶
Name: mission_intent. Type: object. Reference: Section 4
of this document. Behavior by grant state: valid only in the grant
request that opens a negotiation; a continuation or modification
request carrying it is rejected with invalid_request in every
state (Section 6.2). It never appears in responses.¶
GNAP Grant Response Parameters registry ([RFC9635]):¶
Name: mission. Type: object. Reference: Section 9.1 of
this document. Behavior by grant state: returned in responses for
a grant governed by a Mission once the approval event has created
the record, in the approved state and in pending or
processing rounds that follow it; absent before approval.¶
Token introspection response registry ([RFC9767]):¶
Name: mission. Type: object. Reference: Section 9.1 and
Section 8.2 of this document. Returned only in active
introspection responses for tokens issued under a Mission.¶
The family discovery members of Section 8.2 remain to be
registered in the GNAP Authorization Server Discovery Fields
registry of [RFC9635] and the RS-facing discovery registry of
[RFC9767] in a later revision (Section 11). The mission JWT
claim is registered by the issuance profile.¶
This document is part of the Mission-Bound Authorization work. It binds the Mission model to the GNAP authorization server, and builds on the Mission Substrate Requirements, Mission Status and Lifecycle, and Mission-Bound Runtime Enforcement companions. GNAP's continuable grant, key-bound client instances, native pending state, and structured access rights anticipated the geometry agents now present; this binding supplies the governed object those mechanics were built to negotiate.¶