| Internet-Draft | OAuth Authorization Evidence | June 2026 |
| Liu, et al. | Expires 12 December 2026 | [Page] |
This specification defines JWT claims for including authorization evidence and audit trail information in OAuth 2.0 access tokens. These claims enable cryptographic proof of user consent, supporting accountability, compliance, and dispute resolution in scenarios where autonomous agents act on behalf of users.¶
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 3 December 2026.¶
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.¶
In traditional OAuth 2.0 [RFC6749] flows, the Authorization Server records user consent internally, but this information is not typically conveyed to Resource Servers or included in access tokens. For many use cases, this is sufficient. However, emerging scenarios, particularly those involving AI agents acting autonomously on behalf of users, require stronger guarantees about user intent and consent.¶
This specification addresses the need for:¶
This specification defines two JWT claims: evidence for user
confirmation records, and audit_trail for semantic traceability
metadata.¶
Unless otherwise noted, all data types and serialization rules follow the JSON data interchange format as defined in [RFC8259].¶
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.¶
This specification defines general-purpose JWT claims that MAY be used with various OAuth 2.0 authorization flows, including but not limited to:¶
Different authorization flows may have different security considerations when using this specification. Implementations SHOULD carefully evaluate the security implications based on their specific deployment scenario.¶
The evidence claim contains a record of the user's confirmation
action during the authorization process. It is included in JWT access
tokens [RFC7519] to provide verifiable proof of user consent.¶
{
"evidence": {
"id": "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
"user_confirmation": {
"displayed_content": "Add items under $50 to cart",
"user_action": "confirmed_via_button_click",
"timestamp": 1731320595
},
"as_signature": "eyJhbGciOiJFUzI1NiJ9..MEUCIQDx..."
}
}
| Field | Type | Requirement | Description |
|---|---|---|---|
| id | string | REQUIRED | Unique identifier for this evidence record. The value MUST use a URI or URN format with at least 128 bits of collision resistance. UUID URNs (e.g., "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6") are RECOMMENDED. |
| user_confirmation | object | REQUIRED | Details of the user's confirmation action. |
| as_signature | string | REQUIRED | AS signature over the confirmation record. |
| Field | Type | Requirement | Description |
|---|---|---|---|
| displayed_content | string | REQUIRED | The text shown to user for confirmation. |
| user_action | string | REQUIRED | How the user confirmed the operation. The value
is a free-form string, but implementations SHOULD
use values from the following set for
interoperability: button_click,
biometric_confirmation,
pin_entry, voice_confirmation,
hardware_key, implicit_consent.
Custom values MAY be used for deployment-specific
confirmation mechanisms. |
| timestamp | NumericDate | REQUIRED | When the confirmation occurred. |
The as_signature field contains a cryptographic signature from
the Authorization Server over the evidence record. This signature:¶
The signature MUST be computed over the following fields of the
evidence object:¶
The as_signature field itself MUST be excluded from the
signature computation. The signature format MUST be a detached
JWS [RFC7515] in Compact Serialization using the AS's signing key.
In detached Compact Serialization (see RFC 7515 Appendix F), the
payload portion is omitted, resulting in the format
"header..signature".¶
The signature input is constructed using the following deterministic algorithm:¶
id and user_confirmation fields
copied from the evidence object. No other
fields from the evidence object are included.¶
header..signature) is stored in the
as_signature field of the evidence
object.¶
To verify an as_signature, the verifier
reconstructs the JCS input by performing Steps 1 and 2 above
on the received evidence object (excluding the
as_signature field), then verifies the detached
JWS using the AS's public key. Any extension fields
present in the evidence object beyond
id, user_confirmation,
and as_signature
MUST NOT be included in the JCS input and therefore
are not covered by the signature.¶
Note: In examples throughout this document, the
as_signature value is shown in abbreviated form for
readability. Actual values MUST use the detached JWS Compact
Serialization format described above.¶
The key used to sign the evidence record MAY be the same key used to sign the access token, or it MAY be a separate dedicated key. When a separate key is used, implementations MUST ensure that the evidence signing key is associated with the AS through a verifiable mechanism (e.g., published in the AS's JWKS endpoint as defined in [RFC7517]). Using a dedicated evidence signing key enables independent key rotation for evidence records without affecting token validation, which is RECOMMENDED for deployments where evidence records have longer retention periods than access tokens.¶
The audit_trail claim provides metadata for semantic traceability,
enabling analysis of how user intent was interpreted and translated into
authorized operations.¶
{
"audit_trail": {
"evidence_ref": "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
"semantic_expansion_level": "medium",
"proposal_ref": "urn:uuid:proposal-xyz"
}
}
| Field | Type | Requirement | Description |
|---|---|---|---|
| evidence_ref | string | OPTIONAL | Reference to the evidence record by ID. |
| semantic_expansion_level | string | OPTIONAL | Degree of interpretation applied (none, low, medium, high). |
| proposal_ref | URI | OPTIONAL | Reference to the original authorization proposal, the agent's initial request describing the intended operation before the AS applied policy evaluation, scope reduction, or user consent modifications. The value is an opaque URI assigned by the AS for internal correlation; no protocol for retrieving the proposal content via this URI is defined by this specification. This enables post-hoc comparison between what the agent originally requested and what was ultimately authorized. |
The semantic_expansion_level field indicates how much the system
interpreted or expanded the user's original intent. The
following four values form a closed set; implementations
MUST NOT use values outside this set:¶
When the audit_trail claim is included, the
evidence_ref field SHOULD be present to link
the audit record to its corresponding evidence. Including
at least evidence_ref and
semantic_expansion_level is RECOMMENDED for
meaningful audit capability.¶
The evidence and audit trail claims serve several important purposes:¶
| Purpose | Description |
|---|---|
| Intent Provenance | Records what the user intended, preventing disputes about authorization scope. |
| Action Interpretation | Documents how the system translated intent into operations, showing the reasoning process. |
| Semantic Transparency | Reveals any expansions or defaults applied, enabling users to understand what was authorized. |
| User Confirmation | Provides timestamped proof that the user reviewed and approved the operation. |
| Accountability Support | Enables post-hoc analysis to determine responsibility for erroneous transactions. |
The evidence claim records the outcome of a user
consent interaction. Before the AS can generate a signed
evidence record, it must first present a consent interface
to the user and capture the user's response. This section
describes the general consent-to-evidence pattern and provides
a concrete example using the JWT Grant Interaction Response
flow.¶
Regardless of the specific OAuth grant type, evidence collection follows a common pattern:¶
displayed_content).¶
evidence object as defined in
Section 3.¶
The following diagram illustrates this pattern:¶
Client/Agent Authorization Server User
| | |
|-- authorization req --->| |
| | |
| |--- consent UI ---------->|
| | (displayed_content) |
| | |
| |<-- user action ----------|
| | (button_click, etc.) |
| | |
| | [capture evidence] |
| | [sign with as_signature]|
| | |
|<-- access token --------| |
| (with evidence) | |
| | |
Each field in the evidence claim corresponds to
a specific event during the consent interaction:¶
| Consent UI Event | Evidence Field | Description |
|---|---|---|
| AS renders consent page |
displayed_content
|
The text shown to the user describing the requested operation |
| User confirms or denies |
user_action
|
How the user responded (button click, biometric, PIN, etc.) |
| Confirmation timestamp |
timestamp
|
Server-side time when the user's action was received |
The JWT Grant Interaction Response ([I-D.parecki-oauth-jwt-grant-interaction-response]) defines a mechanism for AI agents to obtain user consent from an external Authorization Server. The following sequence shows how evidence is collected during this flow:¶
authorization_details.¶
interaction_required error containing an
interaction_uri (a URL hosted by the AS for
the consent interface) and a polling
interval.¶
interaction_uri in the
user's browser. The AS presents a consent page
showing the interpreted operation (e.g., "Add items
under $50 to cart on your behalf").¶
The user reviews the displayed content and clicks "Allow". The AS captures:¶
evidence object,
computes the as_signature per
Section 3, and stores the
evidence record.¶
evidence claim.¶
AI Agent External AS User | | | |-- token request ->| | | | | |<- interaction_ | | | required | | | (interaction_ | | | uri, interval) | | | | | |-- open interaction_uri in browser ------------>| | | | | |--- consent UI ------------>| | | "Add items under $50 | | | to cart on your behalf"| | | | | |<-- user clicks [Allow] ----| | | | | | [capture evidence fields] | | | [compute as_signature] | | | | |-- poll token --->| | | endpoint | | | | | |<- access token ---| | | (with evidence) | | | | |
The consent-to-evidence pattern described above applies to any OAuth flow that involves user interaction. For example:¶
/authorize redirect. Evidence is collected
when the user approves or denies the request.¶
Flows that do not involve user interaction (e.g.,
Client Credentials Grant without user context) cannot
produce evidence claims, since there is no
user confirmation to record. Such flows MAY still use
the audit_trail claim
(Section 4) for semantic
traceability without user confirmation evidence.¶
When issuing an access token with evidence, the AS MUST:¶
The AS SHOULD retain evidence records for a configurable period to support:¶
The retention period SHOULD be at least as long as the longest-lived token that references the evidence record, plus a configurable grace period for post-expiration disputes. For regulated industries (e.g., financial services under PCI-DSS, healthcare under HIPAA), the retention period MUST comply with the applicable regulatory minimums, which typically range from 1 to 7 years. Implementations SHOULD support per-deployment configuration of retention periods and provide automated purging of expired evidence records.¶
When a token carrying an evidence claim is used as
the subject_token in a Token Exchange request
([RFC8693]), the AS issuing the exchanged token
MUST decide how to handle the original evidence. Three
strategies are defined:¶
evidence claim into the new
token. This preserves the direct link to the original
user consent. The original AS signature remains valid
because the evidence fields are not re-signed. This
strategy is RECOMMENDED when the exchanged token's scope
is a subset of the original token's scope. When the
exchanging AS is different from the original AS, the
exchanging AS MUST verify the original
as_signature before propagating, and MAY
re-sign the evidence with its own key to establish a
direct trust chain with the target RS.¶
evidence object with an
audit_trail claim containing only the
evidence_ref pointing to the original evidence
record. This reduces token size while maintaining
traceability. Implementations using this strategy MUST
ensure the referenced evidence record is retrievable by
the target RS (e.g., via introspection).¶
When using the Propagate strategy with delegation chains
([I-D.liu-oauth-chain-delegation]), the
root_evidence_ref in the delegation chain entry
SHOULD reference the same evidence record, creating an
unbroken audit trail from the original user consent through
all delegation hops.¶
When an access token carrying an evidence claim
expires and the client obtains a new access token using a
refresh token, the AS MUST decide whether to include
evidence in the refreshed token. The same three strategies
defined in Section 6.4
(Propagate, Reference, Omit) apply, with the following
additional considerations:¶
user_confirmation.timestamp in the
propagated evidence reflects the original consent time,
which may be significantly earlier than the refreshed
token's iat claim. The RS SHOULD evaluate
evidence freshness
(Section 8) against the original
consent time, not the refresh time.¶
Resource Servers MAY verify the evidence claim by:¶
as_signature from the evidence;¶
id and timestamp are
consistent with the token's iat claim (i.e., the
user confirmation occurred before or at token issuance);¶
Note: The displayed_content field records what was
shown to the user during consent. The RS typically does not
have direct knowledge of the consent interaction and therefore
cannot independently verify this field. Instead, the RS
relies on the AS signature as proof that the AS witnessed the
user's consent to the described operation.¶
Resource Servers SHOULD log evidence information for audit purposes, including:¶
This section discusses security considerations specific to authorization evidence in OAuth 2.0. General OAuth 2.0 security considerations, including token threats and countermeasures, are described in [RFC6819].¶
The AS signature over the evidence fields (id and user_confirmation) is critical for evidence integrity. Implementations MUST:¶
The evidence claim is protected by the access token's signature. However,
the as_signature field provides an additional layer of protection
specifically for the user confirmation record.¶
It is important to understand the trust boundary of the
evidence mechanism: the as_signature provides
cryptographic proof that the AS recorded a
user confirmation. It does not independently prove that
the user actually consented. The AS
controls both the consent interaction and the signing key,
so a compromised or malicious AS could fabricate evidence
records. Trust in the evidence record therefore depends
on trust in the AS and its operational security.
Deployments requiring stronger non-repudiation guarantees
SHOULD supplement this mechanism with user-side signatures
or independent consent auditing.¶
Evidence records are bound to specific access tokens. The evidence ID and timestamp help detect attempts to reuse evidence across different authorization contexts.¶
Including evidence and audit_trail claims increases access token size. Implementations SHOULD consider:¶
The evidence claim is embedded in a signed access
token ([RFC9068]), which provides
integrity protection at the token level. The inner
as_signature provides a second, independent integrity
layer specifically over the user confirmation record. This
dual-signature design ensures that:¶
as_signature.¶
Implementations MUST NOT copy an evidence claim from
one access token into another without re-validating the
as_signature and confirming that the evidence
id and timestamp are consistent with the
new token's context.¶
The dual-signature design described above applies to signed
JWT access tokens ([RFC9068]). When opaque
(reference) tokens are used, the evidence claim is
not embedded in the token itself and MUST be retrieved by
the RS via token introspection ([RFC7662])
or a dedicated evidence retrieval endpoint. In this case,
the as_signature provides the sole integrity
protection for the evidence record, and implementations
MUST ensure that the transport between the RS and the
introspection or retrieval endpoint is protected with TLS.¶
An evidence record captures user consent at a specific point in time. Deployments SHOULD define an evidence freshness policy that specifies:¶
user_confirmation.timestamp to the
current time);¶
iat claim or the current request time;¶
For high-sensitivity operations (e.g., financial transactions), a short freshness window (e.g., minutes) is RECOMMENDED. For lower-sensitivity operations, a longer window (e.g., hours) may be acceptable.¶
In cross-domain scenarios where the RS is in a different
trust domain than the AS, the RS must be able to verify the
as_signature using the AS's public key.
Implementations SHOULD:¶
kid (Key ID) in the JWS header of
the as_signature to enable key selection;¶
When the AS and RS belong to different administrative domains, trust establishment for the evidence signing key MAY be facilitated through a trust framework, federation agreement, or explicit key distribution mechanism.¶
The privacy considerations in this section are informed by the Internet protocol privacy analysis framework described in [RFC6973].¶
The displayed_content field may contain sensitive information about
the user's intent. Implementations SHOULD:¶
Evidence records may be subject to data protection regulations. Implementations MUST:¶
Data protection regulations such as GDPR and CCPA grant
individuals the right to request deletion of their personal
data. Evidence records, which may contain
displayed_content reflecting user intent,
can constitute personal data.¶
However, evidence records also serve as audit artifacts required by financial, healthcare, and other regulated industries. Implementations SHOULD resolve this tension by:¶
Note on redaction and signature integrity: The
as_signature covers the id and
user_confirmation
fields as an inseparable unit. Redacting any field within
these objects (e.g., removing displayed_content)
invalidates the as_signature. Implementations
that require redaction of personal data from evidence
records SHOULD use the Reference strategy defined in
Section 6.4 (Evidence in Token Exchange):
issue tokens that carry only an audit_trail claim
with the evidence_ref, and perform redaction in
the AS's evidence store. The RS then retrieves the
(potentially redacted) evidence record via token
introspection ([RFC7662]) rather than
reading it directly from the token.¶
This specification registers the following claims in the "JSON Web Token Claims" registry:¶
The following shows a complete access token with both evidence and audit_trail claims:¶
This example also illustrates how the evidence claim
complements the rego_policy authorization data type
([I-D.liu-oauth-rego-policy]). While the Rego
policy defines what operations are permitted
(the behavioral constraint contract), the evidence claim records
why those operations were authorized (the user's
explicit consent). Together, they enable a Resource Server to
enforce fine-grained policy while maintaining a verifiable audit
trail linking each authorized action back to user intent.¶
The act.sub value uses the wit:// URI scheme
to identify the acting agent by its workload identity, as
defined in the Identity Assertion Authorization Grant
([I-D.ietf-oauth-identity-assertion-authz-grant]).
The hash suffix provides a collision-resistant binding between
the URI and the agent's attestation evidence.¶
{
"iss": "https://as.example.com",
"sub": "user_12345",
"aud": "https://api.shop.example",
"exp": 1731369540,
"iat": 1731320700,
"jti": "urn:uuid:token-abc-123",
"act": {
"sub": "wit://myassistant.example/sha256.abc123..."
},
"evidence": {
"id": "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
"user_confirmation": {
"displayed_content": "Add items under $50 to cart",
"user_action": "confirmed_via_button_click",
"timestamp": 1731320595
},
"as_signature": "eyJhbGciOiJFUzI1NiJ9..MEUCIQDx..."
},
"audit_trail": {
"evidence_ref": "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
"semantic_expansion_level": "medium",
"proposal_ref": "urn:uuid:proposal-xyz"
},
"authorization_details": [
{
"type": "rego_policy",
"policy": {
"type": "rego",
"uri": "https://as.example.com/policies/policy-cart-50",
"entry_point": "allow"
}
}
]
}
The authors would like to thank Brian Campbell for his valuable feedback and insightful discussions during the development of this specification. His contributions helped shape key design decisions.¶