summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9635.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc9635.txt')
-rw-r--r--doc/rfc/rfc9635.txt10186
1 files changed, 10186 insertions, 0 deletions
diff --git a/doc/rfc/rfc9635.txt b/doc/rfc/rfc9635.txt
new file mode 100644
index 0000000..d157b92
--- /dev/null
+++ b/doc/rfc/rfc9635.txt
@@ -0,0 +1,10186 @@
+
+
+
+
+Internet Engineering Task Force (IETF) J. Richer, Ed.
+Request for Comments: 9635 Bespoke Engineering
+Category: Standards Track F. Imbault
+ISSN: 2070-1721 acert.io
+ October 2024
+
+
+ Grant Negotiation and Authorization Protocol (GNAP)
+
+Abstract
+
+ The Grant Negotiation and Authorization Protocol (GNAP) defines a
+ mechanism for delegating authorization to a piece of software and
+ conveying the results and artifacts of that delegation to the
+ software. This delegation can include access to a set of APIs as
+ well as subject information passed directly to the software.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc9635.
+
+Copyright Notice
+
+ Copyright (c) 2024 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.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Terminology
+ 1.2. Roles
+ 1.3. Elements
+ 1.4. Trust Relationships
+ 1.5. Protocol Flow
+ 1.6. Sequences
+ 1.6.1. Overall Protocol Sequence
+ 1.6.2. Redirect-Based Interaction
+ 1.6.3. User Code Interaction
+ 1.6.4. Asynchronous Authorization
+ 1.6.5. Software-Only Authorization
+ 1.6.6. Refreshing an Expired Access Token
+ 1.6.7. Requesting Subject Information Only
+ 1.6.8. Cross-User Authentication
+ 2. Requesting Access
+ 2.1. Requesting Access to Resources
+ 2.1.1. Requesting a Single Access Token
+ 2.1.2. Requesting Multiple Access Tokens
+ 2.2. Requesting Subject Information
+ 2.3. Identifying the Client Instance
+ 2.3.1. Identifying the Client Instance by Reference
+ 2.3.2. Providing Displayable Client Instance Information
+ 2.3.3. Authenticating the Client Instance
+ 2.4. Identifying the User
+ 2.4.1. Identifying the User by Reference
+ 2.5. Interacting with the User
+ 2.5.1. Start Mode Definitions
+ 2.5.2. Interaction Finish Methods
+ 2.5.3. Hints
+ 3. Grant Response
+ 3.1. Request Continuation
+ 3.2. Access Tokens
+ 3.2.1. Single Access Token
+ 3.2.2. Multiple Access Tokens
+ 3.3. Interaction Modes
+ 3.3.1. Redirection to an Arbitrary URI
+ 3.3.2. Launch of an Application URI
+ 3.3.3. Display of a Short User Code
+ 3.3.4. Display of a Short User Code and URI
+ 3.3.5. Interaction Finish
+ 3.4. Returning Subject Information
+ 3.4.1. Assertion Formats
+ 3.5. Returning a Dynamically Bound Client Instance Identifier
+ 3.6. Error Response
+ 4. Determining Authorization and Consent
+ 4.1. Starting Interaction with the End User
+ 4.1.1. Interaction at a Redirected URI
+ 4.1.2. Interaction at the Static User Code URI
+ 4.1.3. Interaction at a Dynamic User Code URI
+ 4.1.4. Interaction through an Application URI
+ 4.2. Post-Interaction Completion
+ 4.2.1. Completing Interaction with a Browser Redirect to the
+ Callback URI
+ 4.2.2. Completing Interaction with a Direct HTTP Request
+ Callback
+ 4.2.3. Calculating the Interaction Hash
+ 5. Continuing a Grant Request
+ 5.1. Continuing after a Completed Interaction
+ 5.2. Continuing during Pending Interaction (Polling)
+ 5.3. Modifying an Existing Request
+ 5.4. Revoking a Grant Request
+ 6. Token Management
+ 6.1. Rotating the Access Token Value
+ 6.1.1. Binding a New Key to the Rotated Access Token
+ 6.2. Revoking the Access Token
+ 7. Securing Requests from the Client Instance
+ 7.1. Key Formats
+ 7.1.1. Key References
+ 7.1.2. Key Protection
+ 7.2. Presenting Access Tokens
+ 7.3. Proving Possession of a Key with a Request
+ 7.3.1. HTTP Message Signatures
+ 7.3.2. Mutual TLS
+ 7.3.3. Detached JWS
+ 7.3.4. Attached JWS
+ 8. Resource Access Rights
+ 8.1. Requesting Resources by Reference
+ 9. Discovery
+ 9.1. RS-First Method of AS Discovery
+ 9.2. Dynamic Grant Endpoint Discovery
+ 10. IANA Considerations
+ 10.1. HTTP Authentication Scheme Registration
+ 10.2. Media Type Registration
+ 10.2.1. application/gnap-binding-jwsd
+ 10.2.2. application/gnap-binding-jws
+ 10.2.3. application/gnap-binding-rotation-jwsd
+ 10.2.4. application/gnap-binding-rotation-jws
+ 10.3. GNAP Grant Request Parameters
+ 10.3.1. Registration Template
+ 10.3.2. Initial Contents
+ 10.4. GNAP Access Token Flags
+ 10.4.1. Registration Template
+ 10.4.2. Initial Contents
+ 10.5. GNAP Subject Information Request Fields
+ 10.5.1. Registration Template
+ 10.5.2. Initial Contents
+ 10.6. GNAP Assertion Formats
+ 10.6.1. Registration Template
+ 10.6.2. Initial Contents
+ 10.7. GNAP Client Instance Fields
+ 10.7.1. Registration Template
+ 10.7.2. Initial Contents
+ 10.8. GNAP Client Instance Display Fields
+ 10.8.1. Registration Template
+ 10.8.2. Initial Contents
+ 10.9. GNAP Interaction Start Modes
+ 10.9.1. Registration Template
+ 10.9.2. Initial Contents
+ 10.10. GNAP Interaction Finish Methods
+ 10.10.1. Registration Template
+ 10.10.2. Initial Contents
+ 10.11. GNAP Interaction Hints
+ 10.11.1. Registration Template
+ 10.11.2. Initial Contents
+ 10.12. GNAP Grant Response Parameters
+ 10.12.1. Registration Template
+ 10.12.2. Initial Contents
+ 10.13. GNAP Interaction Mode Responses
+ 10.13.1. Registration Template
+ 10.13.2. Initial Contents
+ 10.14. GNAP Subject Information Response Fields
+ 10.14.1. Registration Template
+ 10.14.2. Initial Contents
+ 10.15. GNAP Error Codes
+ 10.15.1. Registration Template
+ 10.15.2. Initial Contents
+ 10.16. GNAP Key Proofing Methods
+ 10.16.1. Registration Template
+ 10.16.2. Initial Contents
+ 10.17. GNAP Key Formats
+ 10.17.1. Registration Template
+ 10.17.2. Initial Contents
+ 10.18. GNAP Authorization Server Discovery Fields
+ 10.18.1. Registration Template
+ 10.18.2. Initial Contents
+ 11. Security Considerations
+ 11.1. TLS Protection in Transit
+ 11.2. Signing Requests from the Client Software
+ 11.3. MTLS Message Integrity
+ 11.4. MTLS Deployment Patterns
+ 11.5. Protection of Client Instance Key Material
+ 11.6. Protection of Authorization Server
+ 11.7. Symmetric and Asymmetric Client Instance Keys
+ 11.8. Generation of Access Tokens
+ 11.9. Bearer Access Tokens
+ 11.10. Key-Bound Access Tokens
+ 11.11. Exposure of End-User Credentials to Client Instance
+ 11.12. Mixing Up Authorization Servers
+ 11.13. Processing of Client-Presented User Information
+ 11.14. Client Instance Pre-registration
+ 11.15. Client Instance Impersonation
+ 11.16. Client-Hosted Logo URI
+ 11.17. Interception of Information in the Browser
+ 11.18. Callback URI Manipulation
+ 11.19. Redirection Status Codes
+ 11.20. Interception of Responses from the AS
+ 11.21. Key Distribution
+ 11.22. Key Rotation Policy
+ 11.23. Interaction Finish Modes and Polling
+ 11.24. Session Management for Interaction Finish Methods
+ 11.25. Calculating Interaction Hash
+ 11.26. Storage of Information during Interaction and Continuation
+ 11.27. Denial of Service (DoS) through Grant Continuation
+ 11.28. Exhaustion of Random Value Space
+ 11.29. Front-Channel URIs
+ 11.30. Processing Assertions
+ 11.31. Stolen Token Replay
+ 11.32. Self-Contained Stateless Access Tokens
+ 11.33. Network Problems and Token and Grant Management
+ 11.34. Server-Side Request Forgery (SSRF)
+ 11.35. Multiple Key Formats
+ 11.36. Asynchronous Interactions
+ 11.37. Compromised RS
+ 11.38. AS-Provided Token Keys
+ 12. Privacy Considerations
+ 12.1. Surveillance
+ 12.1.1. Surveillance by the Client
+ 12.1.2. Surveillance by the Authorization Server
+ 12.2. Stored Data
+ 12.3. Intrusion
+ 12.4. Correlation
+ 12.4.1. Correlation by Clients
+ 12.4.2. Correlation by Resource Servers
+ 12.4.3. Correlation by Authorization Servers
+ 12.5. Disclosure in Shared References
+ 13. References
+ 13.1. Normative References
+ 13.2. Informative References
+ Appendix A. Comparison with OAuth 2.0
+ Appendix B. Example Protocol Flows
+ B.1. Redirect-Based User Interaction
+ B.2. Secondary Device Interaction
+ B.3. No User Involvement
+ B.4. Asynchronous Authorization
+ B.5. Applying OAuth 2.0 Scopes and Client IDs
+ Appendix C. Interoperability Profiles
+ C.1. Web-Based Redirection
+ C.2. Secondary Device
+ Appendix D. Guidance for Extensions
+ Appendix E. JSON Structures and Polymorphism
+ Acknowledgements
+ Authors' Addresses
+
+1. Introduction
+
+ GNAP allows a piece of software, the client instance, to request
+ delegated authorization to resource servers and subject information.
+ The delegated access to the resource server can be used by the client
+ instance to access resources and APIs on behalf a resource owner, and
+ delegated access to subject information can in turn be used by the
+ client instance to make authentication decisions. This delegation is
+ facilitated by an authorization server, usually on behalf of a
+ resource owner. The end user operating the software can interact
+ with the authorization server to authenticate, provide consent, and
+ authorize the request as a resource owner.
+
+ The process by which the delegation happens is known as a grant, and
+ GNAP allows for the negotiation of the grant process over time by
+ multiple parties acting in distinct roles.
+
+ This specification focuses on the portions of the delegation process
+ facing the client instance. In particular, this specification
+ defines interoperable methods for a client instance to request,
+ negotiate, and receive access to information facilitated by the
+ authorization server. This specification additionally defines
+ methods for the client instance to access protected resources at a
+ resource server. This specification also discusses discovery
+ mechanisms that enable the client instance to configure itself
+ dynamically. The means for an authorization server and resource
+ server to interoperate are discussed in [GNAP-RS].
+
+ The focus of this protocol is to provide interoperability between the
+ different parties acting in each role, not to specify implementation
+ details of each. Where appropriate, GNAP may make recommendations
+ about internal implementation details, but these recommendations are
+ to ensure the security of the overall deployment rather than to be
+ prescriptive in the implementation.
+
+ This protocol solves many of the same use cases as OAuth 2.0
+ [RFC6749], OpenID Connect [OIDC], and the family of protocols that
+ have grown up around that ecosystem. However, GNAP is not an
+ extension of OAuth 2.0 and is not intended to be directly compatible
+ with OAuth 2.0. GNAP seeks to provide functionality and solve use
+ cases that OAuth 2.0 cannot easily or cleanly address. Appendix A
+ further details the protocol rationale compared to OAuth 2.0. GNAP
+ and OAuth 2.0 will likely exist in parallel for many deployments, and
+ considerations have been taken to facilitate the mapping and
+ transition from existing OAuth 2.0 systems to GNAP. Some examples of
+ these can be found in Appendix B.5.
+
+1.1. Terminology
+
+ 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 contains non-normative examples of partial and complete
+ HTTP messages, JSON structures, URIs, query components, keys, and
+ other elements. Whenever possible, the document uses URI as a
+ generic term, since it aligns with the recommendations in [RFC3986]
+ and better matches the intent that the identifier may be reachable
+ through various/generic means (compared to URLs). Some examples use
+ a single trailing backslash (\) to indicate line wrapping for long
+ values, as per [RFC8792]. The \ character and leading spaces on
+ wrapped lines are not part of the value.
+
+ This document uses the term "mutual TLS" as defined by [RFC8705].
+ The shortened form "MTLS" is used to mean the same thing.
+
+ For brevity, the term "signature" on its own is used in this document
+ to refer to both digital signatures (which use asymmetric
+ cryptography) and keyed Message Authentication Codes (MACs) (which
+ use symmetric cryptography). Similarly, the verb "sign" refers to
+ the generation of either a digital signature or a keyed MAC over a
+ given signature base. The qualified term "digital signature" refers
+ specifically to the output of an asymmetric cryptographic signing
+ operation.
+
+1.2. Roles
+
+ The parties in GNAP perform actions under different roles. Roles are
+ defined by the actions taken and the expectations leveraged on the
+ role by the overall protocol.
+
+ +-------------+ +------------+
+ | | | |
+ |Authorization| | Resource |
+ | Server | | Server |
+ | |<--+ +--->| |
+ +-----+-------+ | | +------------+
+ ║ | |
+ ║ +--+---+---+
+ ║ | Client |
+ ║ | Instance |
+ ║ +----+-----+
+ ║ ║
+ .----+----. ║ .----------.
+ | | +=====+ |
+ | Resource | | End |
+ | Owner | ~ ~ ~ ~ ~ ~ | User |
+ | | | |
+ `---------` `----------`
+
+ Legend:
+ ===== indicates interaction between a human and computer
+ ----- indicates interaction between two pieces of software
+ ~ ~ ~ indicates a potential equivalence or out-of-band
+ communication between roles
+
+ Figure 1: Roles in GNAP
+
+ Authorization Server (AS): Server that grants delegated privileges
+ to a particular instance of client software in the form of access
+ tokens or other information (such as subject information). The AS
+ is uniquely defined by the grant endpoint URI, which is the
+ absolute URI where grant requests are started by clients.
+
+ Client: Application that consumes resources from one or several
+ resource servers, possibly requiring access privileges from one or
+ several ASes. The client is operated by the end user, or it runs
+ autonomously on behalf of a resource owner.
+
+ For example, a client can be a mobile application, a web
+ application, a backend data processor, etc.
+
+ Note: This specification differentiates between a specific
+ instance (the client instance, identified by its unique key) and
+ the software running the instance (the client software). For some
+ kinds of client software, there could be many instances of that
+ software, each instance with a different key.
+
+ Resource Server (RS): Server that provides an API on protected
+ resources, where operations on the API require a valid access
+ token issued by a trusted AS.
+
+ Resource Owner (RO): Subject entity that may grant or deny
+ operations on resources it has authority upon.
+
+ Note: The act of granting or denying an operation may be manual
+ (i.e., through an interaction with a physical person) or automatic
+ (i.e., through predefined organizational rules).
+
+ End user: Natural person that operates a client instance.
+
+ Note: That natural person may or may not be the same entity as the
+ RO.
+
+ The design of GNAP does not assume any one deployment architecture
+ but instead attempts to define roles that can be fulfilled in a
+ number of different ways for different use cases. As long as a given
+ role fulfills all of its obligations and behaviors as defined by the
+ protocol, GNAP does not make additional requirements on its structure
+ or setup.
+
+ Multiple roles can be fulfilled by the same party, and a given party
+ can switch roles in different instances of the protocol. For
+ example, in many instances, the RO and end user are the same person,
+ where a user authorizes the client instance to act on their own
+ behalf at the RS. In this case, one party fulfills the roles of both
+ RO and end user, but the roles themselves are still defined
+ separately from each other to allow for other use cases where they
+ are fulfilled by different parties.
+
+ As another example, in some complex scenarios, an RS receiving
+ requests from one client instance can act as a client instance for a
+ downstream secondary RS in order to fulfill the original request. In
+ this case, one piece of software is both an RS and a client instance
+ from different perspectives, and it fulfills these roles separately
+ as far as the overall protocol is concerned.
+
+ A single role need not be deployed as a monolithic service. For
+ example, a client instance could have frontend components that are
+ installed on the end user's device as well as a backend system that
+ the frontend communicates with. If both of these components
+ participate in the delegation protocol, they are both considered part
+ of the client instance. If there are several copies of the client
+ software that run separately but all share the same key material,
+ such as a deployed cluster, then this cluster is considered a single
+ client instance. In these cases, the distinct components of what is
+ considered a GNAP client instance may use any number of different
+ communication mechanisms between them, all of which would be
+ considered an implementation detail of the client instances and out
+ of scope of GNAP.
+
+ As another example, an AS could likewise be built out of many
+ constituent components in a distributed architecture. The component
+ that the client instance calls directly could be different from the
+ component that the RO interacts with to drive consent, since API
+ calls and user interaction have different security considerations in
+ many environments. Furthermore, the AS could need to collect
+ identity claims about the RO from one system that deals with user
+ attributes while generating access tokens at another system that
+ deals with security rights. From the perspective of GNAP, all of
+ these are pieces of the AS and together fulfill the role of the AS as
+ defined by the protocol. These pieces may have their own internal
+ communications mechanisms, which are considered out of scope of GNAP.
+
+1.3. Elements
+
+ In addition to the roles above, the protocol also involves several
+ elements that are acted upon by the roles throughout the process.
+
+ Access Token: A data artifact representing a set of rights and/or
+ attributes.
+
+ Note: An access token can be first issued to a client instance
+ (requiring authorization by the RO) and subsequently rotated.
+
+ Grant: (verb): To permit an instance of client software to receive
+ some attributes at a specific time and with a specific duration of
+ validity and/or to exercise some set of delegated rights to access
+ a protected resource.
+
+ (noun): The act of granting permission to a client instance.
+
+ Privilege: Right or attribute associated with a subject.
+
+ Note: The RO defines and maintains the rights and attributes
+ associated to the protected resource and might temporarily
+ delegate some set of those privileges to an end user. This
+ process is referred to as "privilege delegation".
+
+ Protected Resource: Protected API that is served by an RS and that
+ can be accessed by a client, if and only if a valid and sufficient
+ access token is provided.
+
+ Note: To avoid complex sentences, the specification document may
+ simply refer to "resource" instead of "protected resource".
+
+ Right: Ability given to a subject to perform a given operation on a
+ resource under the control of an RS.
+
+ Subject: Person or organization. The subject decides whether and
+ under which conditions its attributes can be disclosed to other
+ parties.
+
+ Subject Information: Set of statements and attributes asserted by an
+ AS about a subject. These statements can be used by the client
+ instance as part of an authentication decision.
+
+1.4. Trust Relationships
+
+ GNAP defines its trust objective as follows: the RO trusts the AS to
+ ensure access validation and delegation of protected resources to end
+ users, through third party clients.
+
+ This trust objective can be decomposed into trust relationships
+ between software elements and roles, especially the pairs end user/
+ RO, end user/client, client/AS, RS/RO, AS/RO, and AS/RS. Trust of an
+ agent by its pair can exist if the pair is informed that the agent
+ has made a promise to follow the protocol in the past (e.g., pre-
+ registration and uncompromised cryptographic components) or if the
+ pair is able to infer by indirect means that the agent has made such
+ a promise (e.g., a compliant client request). Each agent defines its
+ own valuation function of promises given or received. Examples of
+ such valuations can be the benefits from interacting with other
+ agents (e.g., safety in client access and interoperability with
+ identity standards), the cost of following the protocol (including
+ its security and privacy requirements and recommendations), a ranking
+ of promise importance (e.g., a policy decision made by the AS), the
+ assessment of one's vulnerability or risk of not being able to defend
+ against threats, etc. Those valuations may depend on the context of
+ the request. For instance, depending on the specific case in which
+ GNAP is used, the AS may decide to either take into account or
+ discard hints provided by the client, or the RS may refuse bearer
+ tokens. Some promises can be affected by previous interactions
+ (e.g., repeated requests).
+
+ Below are details of each trust relationship:
+
+ end user/RO: This relationship exists only when the end user and the
+ RO are different, in which case the end user needs some out-of-
+ band mechanism of getting the RO consent (see Section 4). GNAP
+ generally assumes that humans can be authenticated, thanks to
+ identity protocols (for instance, through an id_token assertion as
+ described in Section 2.2).
+
+ end user/client: The client acts as a user agent. Depending on the
+ technology used (browser, single-page application (SPA), mobile
+ application, Internet of Things (IoT) device, etc.), some
+ interactions may or may not be possible (as described in
+ Section 2.5.1). Client developers implement requirements and
+ generally some recommendations or best practices, so that the end
+ users may confidently use their software. However, end users
+ might also face an attacker's client software or a poorly
+ implemented client without even realizing it.
+
+ end user/AS: When the client supports the interaction feature (see
+ Section 3.3), the end user interacts with the AS through an AS-
+ provided interface. In many cases, this happens through a front-
+ channel interaction through the end user's browser. See
+ Section 11.29 for some considerations in trusting these
+ interactions.
+
+ client/AS: An honest AS may face an attacker's client (as discussed
+ just above), or the reverse, and GNAP aims to make common attacks
+ impractical. This specification makes access tokens opaque to the
+ client and defines the request/response scheme in detail,
+ therefore avoiding extra trust hypotheses from this critical piece
+ of software. Yet, the AS may further define cryptographic
+ attestations or optional rules to simplify the access of clients
+ it already trusts, due to past behavior or organizational policies
+ (see Section 2.3).
+
+ RS/RO: On behalf of the RO, the RS promises to protect its resources
+ from unauthorized access and only accepts valid access tokens
+ issued by a trusted AS. In case tokens are key bound, proper
+ validation of the proofing method is expected from the RS.
+
+ AS/RO: The AS is expected to follow the decisions made by the RO,
+ through either interactive consent requests, repeated
+ interactions, or automated rules (as described in Section 1.6).
+ Privacy considerations aim to reduce the risk of an honest but
+ too-curious AS or the consequences of an unexpected user data
+ exposure.
+
+ AS/RS: The AS promises to issue valid access tokens to legitimate
+ client requests (i.e., after carrying out appropriate due
+ diligence, as defined in the GNAP). Some optional configurations
+ are covered by [GNAP-RS].
+
+ A global assumption made by GNAP is that authorization requests are
+ security and privacy sensitive, and appropriate measures are detailed
+ in Sections 11 and 12, respectively.
+
+ A formal trust model is out of scope of this specification, but one
+ could be developed using techniques such as the Promise Theory
+ [promise-theory].
+
+1.5. Protocol Flow
+
+ GNAP is fundamentally designed to allow delegated access to APIs and
+ other information, such as subject information, using a multi-stage,
+ stateful process. This process allows different parties to provide
+ information into the system to alter and augment the state of the
+ delegated access and its artifacts.
+
+ The underlying requested grant moves through several states as
+ different actions take place during the protocol, as shown in
+ Figure 2.
+
+ .-----.
+ | |
+ +------+--+ | Continue
+ .---Need Interaction---->| | |
+ / | Pending |<--`
+ / .--Finish Interaction--+ |
+ / / (approve/deny) +----+----+
+ / / |
+ / / | Cancel
+ / v v
+ +-+----------+ +===========+
+ | | ║ ║
+---Request-->| Processing +------Finalize---->║ Finalized ║
+ | | ║ ║
+ +-+----------+ +===========+
+ \ ^ ^
+ \ \ | Revoke or
+ \ \ | Finalize
+ \ \ +-----+----+
+ \ `-----Update---------+ |
+ \ | Approved |<--.
+ `-----No Interaction--->| | |
+ +-------+--+ | Continue
+ | |
+ `-----`
+
+ Figure 2: State Diagram of a Grant Request in GNAP
+
+ The state of the grant request is defined and managed by the AS,
+ though the client instance also needs to manage its view of the grant
+ request over time. The means by which these roles manage their state
+ are outside the scope of this specification.
+
+ _Processing_: When a request for access (Section 2) is received by
+ the AS, a new grant request is created and placed in the
+ _processing_ state by the AS. This state is also entered when an
+ existing grant request is updated by the client instance and when
+ interaction is completed. In this state, the AS processes the
+ context of the grant request to determine whether interaction with
+ the end user or RO is required for approval of the request. The
+ grant request has to exit this state before a response can be
+ returned to the client instance. If approval is required, the
+ request moves to the _pending_ state, and the AS returns a
+ continuation response (Section 3.1) along with any appropriate
+ interaction responses (Section 3.3). If no such approval is
+ required, such as when the client instance is acting on its own
+ behalf or the AS can determine that access has been fulfilled, the
+ request moves to the _approved_ state where access tokens for API
+ access (Section 3.2) and subject information (Section 3.4) can be
+ issued to the client instance. If the AS determines that no
+ additional processing can occur (such as a timeout or an
+ unrecoverable error), the grant request is moved to the
+ _finalized_ state and is terminated.
+
+ _Pending_: When a request needs to be approved by an RO, or
+ interaction with the end user is required, the grant request
+ enters a state of _pending_. In this state, no access tokens can
+ be granted, and no subject information can be released to the
+ client instance. While a grant request is in this state, the AS
+ seeks to gather the required consent and authorization (Section 4)
+ for the requested access. A grant request in this state is always
+ associated with a continuation access token bound to the client
+ instance's key (see Section 3.1 for details of the continuation
+ access token). If no interaction finish method (Section 2.5.2) is
+ associated with this request, the client instance can send a
+ polling continuation request (Section 5.2) to the AS. This
+ returns a continuation response (Section 3.1) while the grant
+ request remains in this state, allowing the client instance to
+ continue to check the state of the pending grant request. If an
+ interaction finish method (Section 2.5.2) is specified in the
+ grant request, the client instance can continue the request after
+ interaction (Section 5.1) to the AS to move this request to the
+ _processing_ state to be re-evaluated by the AS. Note that this
+ occurs whether the grant request has been approved or denied by
+ the RO, since the AS needs to take into account the full context
+ of the request before determining the next step for the grant
+ request. When other information is made available in the context
+ of the grant request, such as through the asynchronous actions of
+ the RO, the AS moves this request to the _processing_ state to be
+ re-evaluated. If the AS determines that no additional interaction
+ can occur, e.g., all the interaction methods have timed out or a
+ revocation request (Section 5.4) is received from the client
+ instance, the grant request can be moved to the _finalized_ state.
+
+ _Approved_: When a request has been approved by an RO and no further
+ interaction with the end user is required, the grant request
+ enters a state of _approved_. In this state, responses to the
+ client instance can include access tokens for API access
+ (Section 3.2) and subject information (Section 3.4). If
+ continuation and updates are allowed for this grant request, the
+ AS can include the continuation response (Section 3.1). In this
+ state, post-interaction continuation requests (Section 5.1) are
+ not allowed and will result in an error, since all interaction is
+ assumed to have been completed. If the client instance sends a
+ polling continuation request (Section 5.2) while the request is in
+ this state, new access tokens (Section 3.2) can be issued in the
+ response. Note that this always creates a new access token, but
+ any existing access tokens could be rotated and revoked using the
+ token management API (Section 6). The client instance can send an
+ update continuation request (Section 5.3) to modify the requested
+ access, causing the AS to move the request back to the
+ _processing_ state for re-evaluation. If the AS determines that
+ no additional tokens can be issued and that no additional updates
+ are to be accepted (e.g., the continuation access tokens have
+ expired), the grant is moved to the _finalized_ state.
+
+ _Finalized_: After the access tokens are issued, if the AS does not
+ allow any additional updates on the grant request, the grant
+ request enters the _finalized_ state. This state is also entered
+ when an existing grant request is revoked by the client instance
+ (Section 5.4) or otherwise revoked by the AS (such as through out-
+ of-band action by the RO). This state can also be entered if the
+ AS determines that no additional processing is possible, for
+ example, if the RO has denied the requested access or if
+ interaction is required but no compatible interaction methods are
+ available. Once in this state, no new access tokens can be
+ issued, no subject information can be returned, and no
+ interactions can take place. Once in this state, the grant
+ request is dead and cannot be revived. If future access is
+ desired by the client instance, a new grant request can be
+ created, unrelated to this grant request.
+
+ While it is possible to deploy an AS in a stateless environment, GNAP
+ is a stateful protocol, and such deployments will need a way to
+ manage the current state of the grant request in a secure and
+ deterministic fashion without relying on other components, such as
+ the client software, to keep track of the current state.
+
+1.6. Sequences
+
+ GNAP can be used in a variety of ways to allow the core delegation
+ process to take place. Many portions of this process are
+ conditionally present depending on the context of the deployments,
+ and not every step in this overview will happen in all circumstances.
+
+ Note that a connection between roles in this process does not
+ necessarily indicate that a specific protocol message is sent across
+ the wire between the components fulfilling the roles in question or
+ that a particular step is required every time. For example, for a
+ client instance interested in only getting subject information
+ directly and not calling an RS, all steps involving the RS below do
+ not apply.
+
+ In some circumstances, the information needed at a given stage is
+ communicated out of band or is pre-configured between the components
+ or entities performing the roles. For example, one entity can
+ fulfill multiple roles, so explicit communication between the roles
+ is not necessary within the protocol flow. Additionally, some
+ components may not be involved in all use cases. For example, a
+ client instance could be calling the AS just to get direct user
+ information and have no need to get an access token to call an RS.
+
+1.6.1. Overall Protocol Sequence
+
+ The following diagram provides a general overview of GNAP, including
+ many different optional phases and connections. The diagrams in the
+ following sections provide views of GNAP under more specific
+ circumstances. These additional diagrams use the same conventions as
+ the overall diagram below.
+
+ .----------. .----------.
+ | End user | ~ ~ ~ ~ | Resource |
+ | | | Owner (RO) |
+ `----+-----` `-----+----`
+ ║ ║
+ ║ ║
+ (A) (B)
+ ║ ║
+ ║ ║
+ +-----+--+ ║ +------------+
+ | Client | (1) ║ | Resource |
+ |Instance| ║ | Server |
+ | | +-----------+---+ | (RS) |
+ | +--(2)-->| Authorization | | |
+ | |<-(3)---+ Server | | |
+ | | | (AS) | | |
+ | +--(4)-->| | | |
+ | |<-(5)---+ | | |
+ | | | | | |
+ | +---------------(6)------------->| |
+ | | | | (7) | |
+ | |<--------------(8)------------->| |
+ | | | | | |
+ | +--(9)-->| | | |
+ | |<-(10)--+ | | |
+ | | | | | |
+ | +---------------(11)------------>| |
+ | | | | (12) | |
+ | +--(13)->| | | |
+ | | | | | |
+ +--------+ +---------------+ +------------+
+
+ Legend:
+ ===== indicates a possible interaction with a human
+ ----- indicates an interaction between protocol roles
+ ~ ~ ~ indicates a potential equivalence or out-of-band
+ communication between roles
+
+ Figure 3: Overall Sequence of GNAP
+
+ * (A) The end user interacts with the client instance to indicate a
+ need for resources on behalf of the RO. This could identify the
+ RS that the client instance needs to call, the resources needed,
+ or the RO that is needed to approve the request. Note that the RO
+ and end user are often the same entity in practice, but GNAP makes
+ no general assumption that they are.
+
+ * (1) The client instance determines what access is needed and which
+ AS to approach for access. Note that for most situations, the
+ client instance is pre-configured with which AS to talk to and
+ which kinds of access it needs, but some more dynamic processes
+ are discussed in Section 9.1.
+
+ * (2) The client instance requests access at the AS (Section 2).
+
+ * (3) The AS processes the request and determines what is needed to
+ fulfill the request (see Section 4). The AS sends its response to
+ the client instance (Section 3).
+
+ * (B) If interaction is required, the AS interacts with the RO
+ (Section 4) to gather authorization. The interactive component of
+ the AS can function using a variety of possible mechanisms,
+ including web page redirects, applications, challenge/response
+ protocols, or other methods. The RO approves the request for the
+ client instance being operated by the end user. Note that the RO
+ and end user are often the same entity in practice, and many of
+ GNAP's interaction methods allow the client instance to facilitate
+ the end user interacting with the AS in order to fulfill the role
+ of the RO.
+
+ * (4) The client instance continues the grant at the AS (Section 5).
+ This action could occur in response to receiving a signal that
+ interaction has finished (Section 4.2) or through a periodic
+ polling mechanism, depending on the interaction capabilities of
+ the client software and the options active in the grant request.
+
+ * (5) If the AS determines that access can be granted, it returns a
+ response to the client instance (Section 3), including an access
+ token (Section 3.2) for calling the RS and any directly returned
+ information (Section 3.4) about the RO.
+
+ * (6) The client instance uses the access token (Section 7.2) to
+ call the RS.
+
+ * (7) The RS determines if the token is sufficient for the request
+ by examining the token. The means of the RS determining this
+ access are out of scope of this specification, but some options
+ are discussed in [GNAP-RS].
+
+ * (8) The client instance calls the RS (Section 7.2) using the
+ access token until the RS or client instance determines that the
+ token is no longer valid.
+
+ * (9) When the token no longer works, the client instance rotates
+ the access token (Section 6.1).
+
+ * (10) The AS issues a new access token (Section 3.2) to the client
+ instance with the same rights as the original access token
+ returned in (5).
+
+ * (11) The client instance uses the new access token (Section 7.2)
+ to call the RS.
+
+ * (12) The RS determines if the new token is sufficient for the
+ request, as in (7).
+
+ * (13) The client instance disposes of the token (Section 6.2) once
+ the client instance has completed its access of the RS and no
+ longer needs the token.
+
+ The following sections and Appendix B contain specific guidance on
+ how to use GNAP in different situations and deployments. For
+ example, it is possible for the client instance to never request an
+ access token and never call an RS, just as it is possible to have no
+ end user involved in the delegation process.
+
+1.6.2. Redirect-Based Interaction
+
+ In this example flow, the client instance is a web application that
+ wants access to resources on behalf of the current user, who acts as
+ both the end user and the RO. Since the client instance is capable
+ of directing the user to an arbitrary URI and receiving responses
+ from the user's browser, interaction here is handled through front-
+ channel redirects using the user's browser. The redirection URI used
+ for interaction is a service hosted by the AS in this example. The
+ client instance uses a persistent session with the user to ensure the
+ same user that is starting the interaction is the user that returns
+ from the interaction.
+
+ +--------+ +--------+ .----.
+ | Client | | AS | | End |
+ |Instance| | | | User |
+ | |<=(1)== Start Session ===============================+ |
+ | | | | | |
+ | +--(2)--- Request Access --------->| | | |
+ | | | | | |
+ | |<-(3)-- Interaction Needed -------+ | | |
+ | | | | | |
+ | +==(4)== Redirect for Interaction ===================>| |
+ | | | | +------+
+ | | | |<==(5)==>| |
+ | | | | AuthN | RO |
+ | | | | | |
+ | | | |<==(6)==>| |
+ | | | | AuthZ +------+
+ | | | | | End |
+ | |<=(7)== Redirect for Continuation ===================+ User |
+ | | | | `----`
+ | +--(8)--- Continue Request ------->| |
+ | | | |
+ | |<-(9)----- Grant Access ----------+ |
+ | | | |
+ | | | | +--------+
+ | +--(10)-- Access API ---------------------------->| RS |
+ | | | | | |
+ | |<-(11)-- API Response ---------------------------| |
+ | | | | +--------+
+ +--------+ +--------+
+
+ Figure 4: Diagram of a Redirect-Based Interaction
+
+ * (1) The client instance establishes a session with the user, in
+ the role of the end user.
+
+ * (2) The client instance requests access to the resource
+ (Section 2). The client instance indicates that it can redirect
+ to an arbitrary URI (Section 2.5.1.1) and receive a redirect from
+ the browser (Section 2.5.2.1). The client instance stores
+ verification information for its redirect in the session created
+ in (1).
+
+ * (3) The AS determines that interaction is needed and responds
+ (Section 3) with a URI to send the user to (Section 3.3.1) and
+ information needed to verify the redirect (Section 3.3.5) in (7).
+ The AS also includes information the client instance will need to
+ continue the request (Section 3.1) in (8). The AS associates this
+ continuation information with an ongoing request that will be
+ referenced in (4), (6), and (8).
+
+ * (4) The client instance stores the verification and continuation
+ information from (3) in the session from (1). The client instance
+ then redirects the user to the URI (Section 4.1.1) given by the AS
+ in (3). The user's browser loads the interaction redirect URI.
+ The AS loads the pending request based on the incoming URI
+ generated in (3).
+
+ * (5) The user authenticates at the AS, taking on the role of the
+ RO.
+
+ * (6) As the RO, the user authorizes the pending request from the
+ client instance.
+
+ * (7) When the AS is done interacting with the user, the AS
+ redirects the user back (Section 4.2.1) to the client instance
+ using the redirect URI provided in (2). The redirect URI is
+ augmented with an interaction reference that the AS associates
+ with the ongoing request created in (2) and referenced in (4).
+ The redirect URI is also augmented with a hash of the security
+ information provided in (2) and (3). The client instance loads
+ the verification information from (2) and (3) from the session
+ created in (1). The client instance calculates a hash
+ (Section 4.2.3) based on this information and continues only if
+ the hash validates. Note that the client instance needs to ensure
+ that the parameters for the incoming request match those that it
+ is expecting from the session created in (1). The client instance
+ also needs to be prepared for the end user never being returned to
+ the client instance and handle timeouts appropriately.
+
+ * (8) The client instance loads the continuation information from
+ (3) and sends the interaction reference from (7) in a request to
+ continue the request (Section 5.1). The AS validates the
+ interaction reference, ensuring that the reference is associated
+ with the request being continued.
+
+ * (9) If the request has been authorized, the AS grants access to
+ the information in the form of access tokens (Section 3.2) and
+ direct subject information (Section 3.4) to the client instance.
+
+ * (10) The client instance uses the access token (Section 7.2) to
+ call the RS.
+
+ * (11) The RS validates the access token and returns an appropriate
+ response for the API.
+
+ An example set of protocol messages for this method can be found in
+ Appendix B.1.
+
+1.6.3. User Code Interaction
+
+ In this example flow, the client instance is a device that is capable
+ of presenting a short, human-readable code to the user and directing
+ the user to enter that code at a known URI. The user enters the code
+ at a URI that is an interactive service hosted by the AS in this
+ example. The client instance is not capable of presenting an
+ arbitrary URI to the user, nor is it capable of accepting incoming
+ HTTP requests from the user's browser. The client instance polls the
+ AS while it is waiting for the RO to authorize the request. The
+ user's interaction is assumed to occur on a secondary device. In
+ this example, it is assumed that the user is both the end user and
+ RO. Note that since the user is not assumed to be interacting with
+ the client instance through the same web browser used for interaction
+ at the AS, the user is not shown as being connected to the client
+ instance in this diagram.
+
+ +--------+ +--------+ .----.
+ | Client | | AS | | End |
+ |Instance+--(1)--- Request Access --------->| | | User |
+ | | | | | |
+ | |<-(2)-- Interaction Needed -------+ | | |
+ | | | | | |
+ | +==(3)==== Display User Code ========================>| |
+ | | | | | |
+ | | | |<==(4)===+ |
+ | | | |Open URI | |
+ | | | | +------+
+ | | | |<==(5)==>| RO |
+ | | | | AuthN | |
+ | +--(9)--- Continue Request (A) --->| | | |
+ | | | |<==(6)==>| |
+ | |<-(10)-- Not Yet Granted (Wait) --+ | Code | |
+ | | | | | |
+ | | | |<==(7)==>| |
+ | | | | AuthZ | |
+ | | | | | |
+ | | | |<==(8)==>| |
+ | | | |Complete | |
+ | | | | +------+
+ | +--(11)-- Continue Request (B) --->| | | End |
+ | | | | | User |
+ | |<-(12)----- Grant Access ---------+ | `----`
+ | | | |
+ | | | | +--------+
+ | +--(13)-- Access API ---------------------------->| RS |
+ | | | | | |
+ | |<-(14)-- API Response ---------------------------+ |
+ | | | | +--------+
+ +--------+ +--------+
+
+ Figure 5: Diagram of a User-Code-Based Interaction
+
+ * (1) The client instance requests access to the resource
+ (Section 2). The client instance indicates that it can display a
+ user code (Section 2.5.1.3).
+
+ * (2) The AS determines that interaction is needed and responds
+ (Section 3) with a user code to communicate to the user
+ (Section 3.3.3). The AS also includes information the client
+ instance will need to continue the request (Section 3.1) in (8)
+ and (10). The AS associates this continuation information with an
+ ongoing request that will be referenced in (4), (6), (8), and
+ (10).
+
+ * (3) The client instance stores the continuation information from
+ (2) for use in (8) and (10). The client instance then
+ communicates the code to the user (Section 4.1.2) given by the AS
+ in (2).
+
+ * (4) The user directs their browser to the user code URI. This URI
+ is stable and can be communicated via the client software's
+ documentation, the AS documentation, or the client software
+ itself. Since it is assumed that the RO will interact with the AS
+ through a secondary device, the client instance does not provide a
+ mechanism to launch the RO's browser at this URI.
+
+ * (5) The end user authenticates at the AS, taking on the role of
+ the RO.
+
+ * (6) The RO enters the code communicated in (3) to the AS. The AS
+ validates this code against a current request in process.
+
+ * (7) As the RO, the user authorizes the pending request from the
+ client instance.
+
+ * (8) When the AS is done interacting with the user, the AS
+ indicates to the RO that the request has been completed.
+
+ * (9) Meanwhile, the client instance loads the continuation
+ information stored at (3) and continues the request (Section 5).
+ The AS determines which ongoing access request is referenced here
+ and checks its state.
+
+ * (10) If the access request has not yet been authorized by the RO
+ in (6), the AS responds to the client instance to continue the
+ request (Section 3.1) at a future time through additional polled
+ continuation requests. This response can include updated
+ continuation information as well as information regarding how long
+ the client instance should wait before calling again. The client
+ instance replaces its stored continuation information from the
+ previous response (2). Note that the AS may need to determine
+ that the RO has not approved the request in a sufficient amount of
+ time and return an appropriate error to the client instance.
+
+ * (11) The client instance continues to poll the AS (Section 5.2)
+ with the new continuation information in (9).
+
+ * (12) If the request has been authorized, the AS grants access to
+ the information in the form of access tokens (Section 3.2) and
+ direct subject information (Section 3.4) to the client instance.
+
+ * (13) The client instance uses the access token (Section 7.2) to
+ call the RS.
+
+ * (14) The RS validates the access token and returns an appropriate
+ response for the API.
+
+ An example set of protocol messages for this method can be found in
+ Appendix B.2.
+
+1.6.4. Asynchronous Authorization
+
+ In this example flow, the end user and RO roles are fulfilled by
+ different parties, and the RO does not interact with the client
+ instance. The AS reaches out asynchronously to the RO during the
+ request process to gather the RO's authorization for the client
+ instance's request. The client instance polls the AS while it is
+ waiting for the RO to authorize the request.
+
+ +--------+ +--------+ .----.
+ | Client | | AS | | RO |
+ |Instance+--(1)--- Request Access --------->| | | |
+ | | | | | |
+ | |<-(2)-- Not Yet Granted (Wait) ---+ | | |
+ | | | |<==(3)==>| |
+ | | | | AuthN | |
+ | +--(6)--- Continue Request (A) --->| | | |
+ | | | |<==(4)==>| |
+ | |<-(7)-- Not Yet Granted (Wait) ---+ | AuthZ | |
+ | | | | | |
+ | | | |<==(5)==>| |
+ | | | |Completed| |
+ | | | | | |
+ | +--(8)--- Continue Request (B) --->| | `----`
+ | | | |
+ | |<-(9)------ Grant Access ---------+ |
+ | | | |
+ | | | | +--------+
+ | +--(10)-- Access API ---------------------------->| RS |
+ | | | | | |
+ | |<-(11)-- API Response ---------------------------+ |
+ | | | | +--------+
+ +--------+ +--------+
+
+ Figure 6: Diagram of an Asynchronous Authorization Process, with
+ No End-User Interaction
+
+ * (1) The client instance requests access to the resource
+ (Section 2). The client instance does not send any interaction
+ modes to the server, indicating that it does not expect to
+ interact with the RO. The client instance can also signal which
+ RO it requires authorization from, if known, by using the subject
+ request field (Section 2.2) and user request field (Section 2.4).
+ It's also possible for the AS to determine which RO needs to be
+ contacted by the nature of what access is being requested.
+
+ * (2) The AS determines that interaction is needed, but the client
+ instance cannot interact with the RO. The AS responds (Section 3)
+ with the information the client instance will need to continue the
+ request (Section 3.1) in (6) and (8), including a signal that the
+ client instance should wait before checking the status of the
+ request again. The AS associates this continuation information
+ with an ongoing request that will be referenced in (3), (4), (5),
+ (6), and (8).
+
+ * (3) The AS determines which RO to contact based on the request in
+ (1), through a combination of the user request (Section 2.4), the
+ subject request (Section 2.2), the access request (Section 2.1),
+ and other policy information. The AS contacts the RO and
+ authenticates them.
+
+ * (4) The RO authorizes the pending request from the client
+ instance.
+
+ * (5) When the AS is done interacting with the RO, the AS indicates
+ to the RO that the request has been completed.
+
+ * (6) Meanwhile, the client instance loads the continuation
+ information stored at (2) and continues the request (Section 5).
+ The AS determines which ongoing access request is referenced here
+ and checks its state.
+
+ * (7) If the access request has not yet been authorized by the RO in
+ (6), the AS responds to the client instance to continue the
+ request (Section 3.1) at a future time through additional polling.
+ Note that this response is not an error message, since no error
+ has yet occurred. This response can include refreshed credentials
+ as well as information regarding how long the client instance
+ should wait before calling again. The client instance replaces
+ its stored continuation information from the previous response
+ (2). Note that the AS may need to determine that the RO has not
+ approved the request in a sufficient amount of time and return an
+ appropriate error to the client instance.
+
+ * (8) The client instance continues to poll the AS (Section 5.2)
+ with the new continuation information from (7).
+
+ * (9) If the request has been authorized, the AS grants access to
+ the information in the form of access tokens (Section 3.2) and
+ direct subject information (Section 3.4) to the client instance.
+
+ * (10) The client instance uses the access token (Section 7.2) to
+ call the RS.
+
+ * (11) The RS validates the access token and returns an appropriate
+ response for the API.
+
+ An example set of protocol messages for this method can be found in
+ Appendix B.4.
+
+ Additional considerations for asynchronous interactions like this are
+ discussed in Section 11.36.
+
+1.6.5. Software-Only Authorization
+
+ In this example flow, the AS policy allows the client instance to
+ make a call on its own behalf, without the need for an RO to be
+ involved at runtime to approve the decision. Since there is no
+ explicit RO, the client instance does not interact with an RO.
+
+ +--------+ +--------+
+ | Client | | AS |
+ |Instance+--(1)--- Request Access --->| |
+ | | | |
+ | |<-(2)---- Grant Access -----+ |
+ | | | | +--------+
+ | +--(3)--- Access API ------------------->| RS |
+ | | | | | |
+ | |<-(4)--- API Response ------------------+ |
+ | | | | +--------+
+ +--------+ +--------+
+
+ Figure 7: Diagram of a Software-Only Authorization, with No End
+ User or Explicit Resource Owner
+
+ * (1) The client instance requests access to the resource
+ (Section 2). The client instance does not send any interaction
+ modes to the server.
+
+ * (2) The AS determines that the request has been authorized based
+ on the identity of the client instance making the request and the
+ access requested (Section 2.1). The AS grants access to the
+ resource in the form of access tokens (Section 3.2) to the client
+ instance. Note that direct subject information (Section 3.4) is
+ not generally applicable in this use case, as there is no user
+ involved.
+
+ * (3) The client instance uses the access token (Section 7.2) to
+ call the RS.
+
+ * (4) The RS validates the access token and returns an appropriate
+ response for the API.
+
+ An example set of protocol messages for this method can be found in
+ Appendix B.3.
+
+1.6.6. Refreshing an Expired Access Token
+
+ In this example flow, the client instance receives an access token to
+ access an RS through some valid GNAP process. The client instance
+ uses that token at the RS for some time, but eventually the access
+ token expires. The client instance then gets a refreshed access
+ token by rotating the expired access token's value at the AS using
+ the token management API.
+
+ +--------+ +--------+
+ | Client | | AS |
+ |Instance+--(1)--- Request Access ----------------->| |
+ | | | |
+ | |<-(2)--- Grant Access --------------------+ |
+ | | | |
+ | | +--------+ | |
+ | +--(3)--- Access Resource --->| RS | | |
+ | | | | | |
+ | |<-(4)--- Success Response ---+ | | |
+ | | | | | |
+ | | ( Time Passes ) | | | |
+ | | | | | |
+ | +--(5)--- Access Resource --->| | | |
+ | | | | | |
+ | |<-(6)--- Error Response -----+ | | |
+ | | +--------+ | |
+ | | | |
+ | +--(7)--- Rotate Token ------------------->| |
+ | | | |
+ | |<-(8)--- Rotated Token -------------------+ |
+ | | | |
+ +--------+ +--------+
+
+ Figure 8: Diagram of the Process of Refreshing an Expired Access
+ Token
+
+ * (1) The client instance requests access to the resource
+ (Section 2).
+
+ * (2) The AS grants access to the resource (Section 3) with an
+ access token (Section 3.2) usable at the RS. The access token
+ response includes a token management URI.
+
+ * (3) The client instance uses the access token (Section 7.2) to
+ call the RS.
+
+ * (4) The RS validates the access token and returns an appropriate
+ response for the API.
+
+ * (5) Time passes and the client instance uses the access token to
+ call the RS again.
+
+ * (6) The RS validates the access token and determines that the
+ access token is expired. The RS responds to the client instance
+ with an error.
+
+ * (7) The client instance calls the token management URI returned in
+ (2) to rotate the access token (Section 6.1). The client instance
+ uses the access token (Section 7.2) in this call as well as the
+ appropriate key; see Section 6.1 for details.
+
+ * (8) The AS validates the rotation request, including the signature
+ and keys presented in (7), and refreshes the access token
+ (Section 3.2.1). The response includes a new version of the
+ access token and can also include updated token management
+ information, which the client instance will store in place of the
+ values returned in (2).
+
+1.6.7. Requesting Subject Information Only
+
+ In this scenario, the client instance does not call an RS and does
+ not request an access token. Instead, the client instance only
+ requests and is returned direct subject information (Section 3.4).
+ Many different interaction modes can be used in this scenario, so
+ these are shown only in the abstract as functions of the AS here.
+
+ +--------+ +--------+ .----.
+ | Client | | AS | | End |
+ |Instance| | | | User |
+ | +--(1)--- Request Access --------->| | | |
+ | | | | | |
+ | |<-(2)-- Interaction Needed -------+ | | |
+ | | | | | |
+ | +==(3)== Facilitate Interaction =====================>| |
+ | | | | +------+
+ | | | |<==(4)==>| RO |
+ | | | | AuthN | |
+ | | | | | |
+ | | | |<==(5)==>| |
+ | | | | AuthZ +------+
+ | | | | | End |
+ | |<=(6)== Signal Continuation =========================+ User |
+ | | | | `----`
+ | +--(7)--- Continue Request ------->| |
+ | | | |
+ | |<-(8)----- Grant Access ----------+ |
+ | | | |
+ +--------+ +--------+
+
+ Figure 9: Diagram of the Process of Requesting and Releasing Subject
+ Information apart from Access Tokens
+
+ * (1) The client instance requests access to subject information
+ (Section 2).
+
+ * (2) The AS determines that interaction is needed and responds
+ (Section 3) with appropriate information for facilitating user
+ interaction (Section 3.3).
+
+ * (3) The client instance facilitates the user interacting with the
+ AS (Section 4) as directed in (2).
+
+ * (4) The user authenticates at the AS, taking on the role of the
+ RO.
+
+ * (5) As the RO, the user authorizes the pending request from the
+ client instance.
+
+ * (6) When the AS is done interacting with the user, the AS returns
+ the user to the client instance and signals continuation.
+
+ * (7) The client instance loads the continuation information from
+ (2) and calls the AS to continue the request (Section 5).
+
+ * (8) If the request has been authorized, the AS grants access to
+ the requested direct subject information (Section 3.4) to the
+ client instance. At this stage, the user is generally considered
+ "logged in" to the client instance based on the identifiers and
+ assertions provided by the AS. Note that the AS can restrict the
+ subject information returned, and it might not match what the
+ client instance requested; see Section 3.4 for details.
+
+1.6.8. Cross-User Authentication
+
+ In this scenario, the end user and RO are two different people.
+ Here, the client instance already knows who the end user is, likely
+ through a separate authentication process. The end user, operating
+ the client instance, needs to get subject information about another
+ person in the system, the RO. The RO is given an opportunity to
+ release this information using an asynchronous interaction method
+ with the AS. This scenario would apply, for instance, when the end
+ user is an agent in a call center and the RO is a customer
+ authorizing the call-center agent to access their account on their
+ behalf.
+
+ .----. .----.
+ | End | | RO |
+ | User |<=================(1)== Identify RO ==================>| |
+ | | | |
+ | | +--------+ +--------+ | |
+ | +==(2)==>| Client | | AS | | |
+ | | RO ID |Instance| | | | |
+ | | | | | | | |
+ | | | +--(3)-- Req. ---->| | | |
+ | | | | | | | |
+ | | | |<-(4)-- Res. -----+ | | |
+ | | | | | |<==(5)==>| |
+ | | | | | | AuthN | |
+ | | | | | | | |
+ | | | | | |<==(6)==>| |
+ | | | | | | AuthZ | |
+ | | | | | | | |
+ | | | | | |<==(7)==>| |
+ | | | |<-(8)--- Finish --+ |Completed| |
+ | | | | | | | |
+ | | | +--(9)--- Cont. -->| | | |
+ | | | | | | | |
+ | | | |<-(10)-- Subj. ---+ | | |
+ | |<=(11)==+ | Info | | | |
+ | | Return | | | | | |
+ | | RO | | | | | |
+ | | Info | | | | | |
+ `----` +--------+ +--------+ `----`
+
+ Figure 10: Diagram of Cross-User Authorization, Where the End
+ User and RO Are Different
+
+ Precondition: The end user is authenticated to the client instance,
+ and the client instance has an identifier representing the end user
+ that it can present to the AS. This identifier should be unique to
+ the particular session with the client instance and the AS. The
+ client instance is also known to the AS and allowed to access this
+ advanced functionality where the information of someone other than
+ the end user is returned to the client instance.
+
+ * (1) The RO communicates a human-readable identifier to the end
+ user, such as an email address or account number. This
+ communication happens out of band from the protocol, such as over
+ the phone between parties. Note that the RO is not interacting
+ with the client instance.
+
+ * (2) The end user communicates the identifier to the client
+ instance. The means by which the identifier is communicated to
+ the client instance are out of scope for this specification.
+
+ * (3) The client instance requests access to subject information
+ (Section 2). The request includes the RO's identifier in the
+ sub_ids field of the subject information request (Section 2.2) and
+ the end user's identifier in the user field (Section 2.4). The
+ request includes no interaction start methods, since the end user
+ is not expected to be the one interacting with the AS. The
+ request does include the push-based interaction finish method
+ (Section 2.5.2.2) to allow the AS to signal to the client instance
+ when the interaction with the RO has concluded.
+
+ * (4) The AS sees that the identifiers for the end user and subject
+ being requested are different. The AS determines that it can
+ reach out to the RO asynchronously for approval. While it is
+ doing so, the AS returns a continuation response (Section 3.1)
+ with a finish nonce to allow the client instance to continue the
+ grant request after interaction with the RO has concluded.
+
+ * (5) The AS contacts the RO and has them authenticate to the
+ system. The means for doing this are outside the scope of this
+ specification, but the identity of the RO is known from the
+ Subject Identifier sent in (3).
+
+ * (6) The RO is prompted to authorize the end user's request via the
+ client instance. Since the end user was identified in (3) via the
+ user field, the AS can show this information to the RO during the
+ authorization request.
+
+ * (7) The RO completes the authorization with the AS. The AS marks
+ the request as _approved_.
+
+ * (8) The RO pushes the interaction finish message (Section 4.2.2)
+ to the client instance. Note that in the case the RO cannot be
+ reached or the RO denies the request, the AS still sends the
+ interaction finish message to the client instance, after which the
+ client instance can negotiate next steps if possible.
+
+ * (9) The client instance validates the interaction finish message
+ and continues the grant request (Section 5.1).
+
+ * (10) The AS returns the RO's subject information (Section 3.4) to
+ the client instance.
+
+ * (11) The client instance can display or otherwise utilize the RO's
+ user information in its session with the end user. Note that
+ since the client instance requested different sets of user
+ information in (3), the client instance does not conflate the end
+ user with the RO.
+
+ Additional considerations for asynchronous interactions like this are
+ discussed in Section 11.36.
+
+2. Requesting Access
+
+ To start a request, the client instance sends an HTTP POST with a
+ JSON [RFC8259] document to the grant endpoint of the AS. The grant
+ endpoint is a URI that uniquely identifies the AS to client instances
+ and serves as the identifier for the AS. The document is a JSON
+ object where each field represents a different aspect of the client
+ instance's request. Each field is described in detail in a
+ subsection below.
+
+ access_token (object / array of objects): Describes the rights and
+ properties associated with the requested access token. REQUIRED
+ if requesting an access token. See Section 2.1.
+
+ subject (object): Describes the information about the RO that the
+ client instance is requesting to be returned directly in the
+ response from the AS. REQUIRED if requesting subject information.
+ See Section 2.2.
+
+ client (object / string): Describes the client instance that is
+ making this request, including the key that the client instance
+ will use to protect this request, any continuation requests at the
+ AS, and any user-facing information about the client instance used
+ in interactions. REQUIRED. See Section 2.3.
+
+ user (object / string): Identifies the end user to the AS in a
+ manner that the AS can verify, either directly or by interacting
+ with the end user to determine their status as the RO. OPTIONAL.
+ See Section 2.4.
+
+ interact (object): Describes the modes that the client instance
+ supports for allowing the RO to interact with the AS and modes for
+ the client instance to receive updates when interaction is
+ complete. REQUIRED if interaction is supported. See Section 2.5.
+
+ Additional members of this request object can be defined by
+ extensions using the "GNAP Grant Request Parameters" registry
+ (Section 10.3).
+
+ A non-normative example of a grant request is below:
+
+ {
+ "access_token": {
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [
+ "read",
+ "write",
+ "dolphin"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ]
+ },
+ "dolphin-metadata"
+ ]
+ },
+ "client": {
+ "display": {
+ "name": "My Client Display Name",
+ "uri": "https://example.net/client"
+ },
+ "key": {
+ "proof": "httpsig",
+ "jwk": {
+ "kty": "RSA",
+ "e": "AQAB",
+ "kid": "xyz-1",
+ "alg": "RS256",
+ "n": "kOB5rR4Jv0GMeL...."
+ }
+ }
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.example.net/return/123455",
+ "nonce": "LKLTI25DK82FX4T4QFZC"
+ }
+ },
+ "subject": {
+ "sub_id_formats": ["iss_sub", "opaque"],
+ "assertion_formats": ["id_token"]
+ }
+ }
+
+ Sending a request to the grant endpoint creates a grant request in
+ the _processing_ state. The AS processes this request to determine
+ whether interaction or authorization are necessary (moving to the
+ _pending_ state) or if access can be granted immediately (moving to
+ the _approved_ state).
+
+ The request MUST be sent as a JSON object in the content of the HTTP
+ POST request with Content-Type application/json. A key proofing
+ mechanism MAY define an alternative content type, as long as the
+ content is formed from the JSON object. For example, the attached
+ JSON Web Signature (JWS) key proofing mechanism (see Section 7.3.4)
+ places the JSON object into the payload of a JWS wrapper, which is in
+ turn sent as the message content.
+
+2.1. Requesting Access to Resources
+
+ If the client instance is requesting one or more access tokens for
+ the purpose of accessing an API, the client instance MUST include an
+ access_token field. This field MUST be an object (for a single
+ access token (Section 2.1.1)) or an array of these objects (for
+ multiple access tokens (Section 2.1.2)), as described in the
+ following subsections.
+
+2.1.1. Requesting a Single Access Token
+
+ To request a single access token, the client instance sends an
+ access_token object composed of the following fields.
+
+ access (array of objects/strings): Describes the rights that the
+ client instance is requesting for the access token to be used at
+ the RS. REQUIRED. See Section 8.
+
+ label (string): A unique name chosen by the client instance to refer
+ to the resulting access token. The value of this field is opaque
+ to the AS and is not intended to be exposed to or used by the end
+ user. If this field is included in the request, the AS MUST
+ include the same label in the token response (Section 3.2).
+ REQUIRED if used as part of a request for multiple access tokens
+ (Section 2.1.2); OPTIONAL otherwise.
+
+ flags (array of strings): A set of flags that indicate desired
+ attributes or behavior to be attached to the access token by the
+ AS. OPTIONAL.
+
+ The values of the flags field defined by this specification are as
+ follows:
+
+ "bearer": If this flag is included, the access token being requested
+ is a bearer token. If this flag is omitted, the access token is
+ bound to the key used by the client instance in this request (or
+ that key's most recent rotation), and the access token MUST be
+ presented using the same key and proofing method. Methods for
+ presenting bound and bearer access tokens are described in
+ Section 7.2. See Section 11.9 for additional considerations on
+ the use of bearer tokens.
+
+ Flag values MUST NOT be included more than once. If the request
+ includes a flag value multiple times, the AS MUST return an
+ invalid_flag error defined in Section 3.6.
+
+ Additional flags can be defined by extensions using the "GNAP Access
+ Token Flags" registry (Section 10.4).
+
+ In the following non-normative example, the client instance is
+ requesting access to a complex resource described by a pair of access
+ request object.
+
+ "access_token": {
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [
+ "read",
+ "write",
+ "delete"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ]
+ },
+ {
+ "type": "walrus-access",
+ "actions": [
+ "foo",
+ "bar"
+ ],
+ "locations": [
+ "https://resource.other/"
+ ],
+ "datatypes": [
+ "data",
+ "pictures",
+ "walrus whiskers"
+ ]
+ }
+ ],
+ "label": "token1-23"
+ }
+
+ If access is approved, the resulting access token is valid for the
+ described resource. Since the bearer flag is not provided in this
+ example, the token is bound to the client instance's key (or its most
+ recent rotation). The token is labeled "token1-23". The token
+ response structure is described in Section 3.2.1.
+
+2.1.2. Requesting Multiple Access Tokens
+
+ To request that multiple access tokens be returned in a single
+ response, the client instance sends an array of objects as the value
+ of the access_token parameter. Each object MUST conform to the
+ request format for a single access token request, as specified in
+ Section 2.1.1. Additionally, each object in the array MUST include
+ the label field, and all values of these fields MUST be unique within
+ the request. If the client instance does not include a label value
+ for any entry in the array or the values of the label field are not
+ unique within the array, the AS MUST return an "invalid_request"
+ error (Section 3.6).
+
+ The following non-normative example shows a request for two separate
+ access tokens: token1 and token2.
+
+ "access_token": [
+ {
+ "label": "token1",
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [
+ "read",
+ "write",
+ "dolphin"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ]
+ },
+ "dolphin-metadata"
+ ]
+ },
+ {
+ "label": "token2",
+ "access": [
+ {
+ "type": "walrus-access",
+ "actions": [
+ "foo",
+ "bar"
+ ],
+ "locations": [
+ "https://resource.other/"
+ ],
+ "datatypes": [
+ "data",
+ "pictures",
+ "walrus whiskers"
+ ]
+ }
+ ],
+ "flags": [ "bearer" ]
+ }
+ ]
+
+ All approved access requests are returned in the response structure
+ for multiple access tokens (Section 3.2.2) using the values of the
+ label fields in the request.
+
+2.2. Requesting Subject Information
+
+ If the client instance is requesting information about the RO from
+ the AS, it sends a subject field as a JSON object. This object MAY
+ contain the following fields.
+
+ sub_id_formats (array of strings): An array of Subject Identifier
+ subject formats requested for the RO, as defined by [RFC9493].
+ REQUIRED if Subject Identifiers are requested.
+
+ assertion_formats (array of strings): An array of requested
+ assertion formats. Possible values include id_token for an OpenID
+ Connect ID Token [OIDC] and saml2 for a Security Assertion Markup
+ Language (SAML) 2 assertion [SAML2]. Additional assertion formats
+ can be defined in the "GNAP Assertion Formats" registry
+ (Section 10.6). REQUIRED if assertions are requested.
+
+ sub_ids (array of objects): An array of Subject Identifiers
+ representing the subject for which information is being requested.
+ Each object is a Subject Identifier as defined by [RFC9493]. All
+ identifiers in the sub_ids array MUST identify the same subject.
+ If omitted, the AS SHOULD assume that subject information requests
+ are about the current user and SHOULD require direct interaction
+ or proof of presence before releasing information. OPTIONAL.
+
+ Additional fields can be defined in the "GNAP Subject Information
+ Request Fields" registry (Section 10.5).
+
+ "subject": {
+ "sub_id_formats": [ "iss_sub", "opaque" ],
+ "assertion_formats": [ "id_token", "saml2" ]
+ }
+
+ The AS can determine the RO's identity and permission for releasing
+ this information through interaction with the RO (Section 4), AS
+ policies, or assertions presented by the client instance
+ (Section 2.4). If this is determined positively, the AS MAY return
+ the RO's information in its response (Section 3.4) as requested.
+
+ Subject Identifier types requested by the client instance serve only
+ to identify the RO in the context of the AS and can't be used as
+ communication channels by the client instance, as discussed in
+ Section 3.4.
+
+2.3. Identifying the Client Instance
+
+ When sending a new grant request to the AS, the client instance MUST
+ identify itself by including its client information in the client
+ field of the request and by signing the request with its unique key
+ as described in Section 7.3. Note that once a grant has been created
+ and is in either the _pending_ or the _approved_ state, the AS can
+ determine which client is associated with the grant by dereferencing
+ the continuation access token sent in the continuation request
+ (Section 5). As a consequence, the client field is not sent or
+ accepted for continuation requests.
+
+ Client information is sent by value as an object or by reference as a
+ string (see Section 2.3.1).
+
+ When client instance information is sent by value, the client field
+ of the request consists of a JSON object with the following fields.
+
+ key (object / string): The public key of the client instance to be
+ used in this request as described in Section 7.1 or a reference to
+ a key as described in Section 7.1.1. REQUIRED.
+
+ class_id (string): An identifier string that the AS can use to
+ identify the client software comprising this client instance. The
+ contents and format of this field are up to the AS. OPTIONAL.
+
+ display (object): An object containing additional information that
+ the AS MAY display to the RO during interaction, authorization,
+ and management. OPTIONAL. See Section 2.3.2.
+
+ "client": {
+ "key": {
+ "proof": "httpsig",
+ "jwk": {
+ "kty": "RSA",
+ "e": "AQAB",
+ "kid": "xyz-1",
+ "alg": "RS256",
+ "n": "kOB5rR4Jv0GMeLaY6_It_r3ORwdf8ci_JtffXyaSx8..."
+ }
+ },
+ "class_id": "web-server-1234",
+ "display": {
+ "name": "My Client Display Name",
+ "uri": "https://example.net/client"
+ }
+ }
+
+ Additional fields can be defined in the "GNAP Client Instance Fields"
+ registry (Section 10.7).
+
+ Absent additional attestations, profiles, or trust mechanisms, both
+ the display and class_id fields are self-declarative, presented by
+ the client instance. The AS needs to exercise caution in their
+ interpretation, taking them as a hint but not as absolute truth. The
+ class_id field can be used in a variety of ways to help the AS make
+ sense of the particular context in which the client instance is
+ operating. In corporate environments, for example, different levels
+ of trust might apply depending on security policies. This field aims
+ to help the AS adjust its own access decisions for different classes
+ of client software. It is possible to configure a set of values and
+ rules during a pre-registration and then have the client instances
+ provide them later in runtime as a hint to the AS. In other cases,
+ the client runs with a specific AS in mind, so a single hardcoded
+ value would be acceptable (for instance, a set-top box with a
+ class_id claiming to be "FooBarTV version 4"). While the client
+ instance may not have contacted the AS yet, the value of this
+ class_id field can be evaluated by the AS according to a broader
+ context of dynamic use, alongside other related information available
+ elsewhere (for instance, corresponding fields in a certificate). If
+ the AS is not able to interpret or validate the class_id field, it
+ MUST either return an invalid_client error (Section 3.6) or interpret
+ the request as if the class_id were not present. See additional
+ discussion of client instance impersonation in Section 11.15.
+
+ The client instance MUST prove possession of any presented key by the
+ proofing mechanism associated with the key in the request. Key
+ proofing methods are defined in the "GNAP Key Proofing Methods"
+ registry (Section 10.16), and an initial set of methods is described
+ in Section 7.3.
+
+ If the same public key is sent by value on different access requests,
+ the AS MUST treat these requests as coming from the same client
+ instance for purposes of identification, authentication, and policy
+ application.
+
+ If the AS does not know the client instance's public key ahead of
+ time, the AS can choose how to process the unknown key. Common
+ approaches include:
+
+ * Allowing the request and requiring RO authorization in a trust-on-
+ first-use model
+
+ * Limiting the client's requested access to only certain APIs and
+ information
+
+ * Denying the request entirely by returning an invalid_client error
+ (Section 3.6)
+
+ The client instance MUST NOT send a symmetric key by value in the key
+ field of the request, as doing so would expose the key directly
+ instead of simply proving possession of it. See considerations on
+ symmetric keys in Section 11.7. To use symmetric keys, the client
+ instance can send the key by reference (Section 7.1.1) or send the
+ entire client identity by reference (Section 2.3.1).
+
+ The client instance's key can be pre-registered with the AS ahead of
+ time and associated with a set of policies and allowable actions
+ pertaining to that client. If this pre-registration includes other
+ fields that can occur in the client request object described in this
+ section, such as class_id or display, the pre-registered values MUST
+ take precedence over any values given at runtime. Additional fields
+ sent during a request but not present in a pre-registered client
+ instance record at the AS SHOULD NOT be added to the client's pre-
+ registered record. See additional considerations regarding client
+ instance impersonation in Section 11.15.
+
+ A client instance that is capable of talking to multiple ASes SHOULD
+ use a different key for each AS to prevent a class of mix-up attacks
+ as described in Section 11.31, unless other mechanisms can be used to
+ assure the identity of the AS for a given request.
+
+2.3.1. Identifying the Client Instance by Reference
+
+ If the client instance has an instance identifier that the AS can use
+ to determine appropriate key information, the client instance can
+ send this instance identifier as a direct reference value in lieu of
+ the client object. The instance identifier MAY be assigned to a
+ client instance at runtime through a grant response (Section 3.5) or
+ MAY be obtained in another fashion, such as a static registration
+ process at the AS.
+
+ "client": "client-541-ab"
+
+ When the AS receives a request with an instance identifier, the AS
+ MUST ensure that the key used to sign the request (Section 7.3) is
+ associated with the instance identifier.
+
+ If the AS does not recognize the instance identifier, the request
+ MUST be rejected with an invalid_client error (Section 3.6).
+
+2.3.2. Providing Displayable Client Instance Information
+
+ If the client instance has additional information to display to the
+ RO during any interactions at the AS, it MAY send that information in
+ the "display" field. This field is a JSON object that declares
+ information to present to the RO during any interactive sequences.
+
+ name (string): Display name of the client software. RECOMMENDED.
+
+ uri (string): User-facing information about the client software,
+ such as a web page. This URI MUST be an absolute URI. OPTIONAL.
+
+ logo_uri (string): Display image to represent the client software.
+ This URI MUST be an absolute URI. The logo MAY be passed by value
+ by using a data: URI [RFC2397] referencing an image media type.
+ OPTIONAL.
+
+ "display": {
+ "name": "My Client Display Name",
+ "uri": "https://example.net/client",
+ "logo_uri": "data:image/png;base64,Eeww...="
+ }
+
+ Additional display fields can be defined in the "GNAP Client Instance
+ Display Fields" registry (Section 10.8).
+
+ The AS SHOULD use these values during interaction with the RO. The
+ values are for informational purposes only and MUST NOT be taken as
+ authentic proof of the client instance's identity or source. The AS
+ MAY restrict display values to specific client instances, as
+ identified by their keys in Section 2.3. See additional
+ considerations for displayed client information in Section 11.15 and
+ for the logo_uri in particular in Section 11.16.
+
+2.3.3. Authenticating the Client Instance
+
+ If the presented key is known to the AS and is associated with a
+ single instance of the client software, the process of presenting a
+ key and proving possession of that key is sufficient to authenticate
+ the client instance to the AS. The AS MAY associate policies with
+ the client instance identified by this key, such as limiting which
+ resources can be requested and which interaction methods can be used.
+ For example, only specific client instances with certain known keys
+ might be trusted with access tokens without the AS interacting
+ directly with the RO, as in Appendix B.3.
+
+ The presentation of a key allows the AS to strongly associate
+ multiple successive requests from the same client instance with each
+ other. This is true when the AS knows the key ahead of time and can
+ use the key to authenticate the client instance, but it is also true
+ if the key is ephemeral and created just for this series of requests.
+ As such, the AS MAY allow for client instances to make requests with
+ unknown keys. This pattern allows for ephemeral client instances
+ (such as single-page applications) and client software with many
+ individual long-lived instances (such as mobile applications) to
+ generate key pairs per instance and use the keys within the protocol
+ without having to go through a separate registration step. The AS
+ MAY limit which capabilities are made available to client instances
+ with unknown keys. For example, the AS could have a policy saying
+ that only previously registered client instances can request
+ particular resources or that all client instances with unknown keys
+ have to be interactively approved by an RO.
+
+2.4. Identifying the User
+
+ If the client instance knows the identity of the end user through one
+ or more identifiers or assertions, the client instance MAY send that
+ information to the AS in the user field. The client instance MAY
+ pass this information by value or by reference (see Section 2.4.1).
+
+ sub_ids (array of objects): An array of Subject Identifiers for the
+ end user, as defined by [RFC9493]. OPTIONAL.
+
+ assertions (array of objects): An array containing assertions as
+ objects, each containing the assertion format and the assertion
+ value as the JSON string serialization of the assertion, as
+ defined in Section 3.4. OPTIONAL.
+
+ "user": {
+ "sub_ids": [ {
+ "format": "opaque",
+ "id": "J2G8G8O4AZ"
+ } ],
+ "assertions": [ {
+ "format": "id_token",
+ "value": "eyj..."
+ } ]
+ }
+
+ Subject Identifiers are hints to the AS in determining the RO and
+ MUST NOT be taken as authoritative statements that a particular RO is
+ present at the client instance and acting as the end user.
+
+ Assertions presented by the client instance SHOULD be validated by
+ the AS. While the details of such validation are outside the scope
+ of this specification, common validation steps include verifying the
+ signature of the assertion against a trusted signing key, verifying
+ the audience and issuer of the assertion map to expected values, and
+ verifying the time window for the assertion itself. However, note
+ that in many use cases, some of these common steps are relaxed. For
+ example, an AS acting as an identity provider (IdP) could expect that
+ assertions being presented using this mechanism were issued by the AS
+ to the client software. The AS would verify that the AS is the
+ issuer of the assertion, not the audience, and that the client
+ instance is instead the audience of the assertion. Similarly, an AS
+ might accept a recently expired assertion in order to help bootstrap
+ a new session with a specific end user.
+
+ If the identified end user does not match the RO present at the AS
+ during an interaction step and the AS is not explicitly allowing a
+ cross-user authorization, the AS SHOULD reject the request with an
+ unknown_user error (Section 3.6).
+
+ If the AS trusts the client instance to present verifiable assertions
+ or known Subject Identifiers, such as an opaque identifier issued by
+ the AS for this specific client instance, the AS MAY decide, based on
+ its policy, to skip interaction with the RO, even if the client
+ instance provides one or more interaction modes in its request.
+
+ See Section 11.30 for considerations for the AS when accepting and
+ processing assertions from the client instance.
+
+2.4.1. Identifying the User by Reference
+
+ The AS can identify the current end user to the client instance with
+ a reference that can be used by the client instance to refer to the
+ end user across multiple requests. If the client instance has a
+ reference for the end user at this AS, the client instance MAY pass
+ that reference as a string. The format of this string is opaque to
+ the client instance.
+
+ "user": "XUT2MFM1XBIKJKSDU8QM"
+
+ One means of dynamically obtaining such a user reference is from the
+ AS returning an opaque Subject Identifier as described in
+ Section 3.4. Other means of configuring a client instance with a
+ user identifier are out of scope of this specification. The lifetime
+ and validity of these user references are determined by the AS, and
+ this lifetime is not exposed to the client instance in GNAP. As
+ such, a client instance using such a user reference is likely to keep
+ using that reference until it stops working.
+
+ User reference identifiers are not intended to be human-readable user
+ identifiers or structured assertions. For the client instance to
+ send either of these, the client can use the full user request object
+ (Section 2.4) instead.
+
+ If the AS does not recognize the user reference, it MUST return an
+ unknown_user error (Section 3.6).
+
+2.5. Interacting with the User
+
+ Often, the AS will require interaction with the RO (Section 4) in
+ order to approve a requested delegation to the client instance for
+ both access to resources and direct subject information. Many times,
+ the end user using the client instance is the same person as the RO,
+ and the client instance can directly drive interaction with the end
+ user by facilitating the process through means such as redirection to
+ a URI or launching an application. Other times, the client instance
+ can provide information to start the RO's interaction on a secondary
+ device, or the client instance will wait for the RO to approve the
+ request asynchronously. The client instance could also be signaled
+ that interaction has concluded through a callback mechanism.
+
+ The client instance declares the parameters for interaction methods
+ that it can support using the interact field.
+
+ The interact field is a JSON object with three keys whose values
+ declare how the client can initiate and complete the request, as well
+ as provide hints to the AS about user preferences such as locale. A
+ client instance MUST NOT declare an interaction mode it does not
+ support. The client instance MAY send multiple modes in the same
+ request. There is no preference order specified in this request. An
+ AS MAY respond to any, all, or none of the presented interaction
+ modes (Section 3.3) in a request, depending on its capabilities and
+ what is allowed to fulfill the request.
+
+ start (array of objects/strings): Indicates how the client instance
+ can start an interaction. REQUIRED. See Section 2.5.1.
+
+ finish (object): Indicates how the client instance can receive an
+ indication that interaction has finished at the AS. OPTIONAL.
+ See Section 2.5.2.
+
+ hints (object): Provides additional information to inform the
+ interaction process at the AS. OPTIONAL. See Section 2.5.3.
+
+ In the following non-normative example, the client instance is
+ indicating that it can redirect (Section 2.5.1.1) the end user to an
+ arbitrary URI and can receive a redirect (Section 2.5.2.1) through a
+ browser request. Note that the client instance does not accept a
+ push-style callback. The pattern of using a redirect for both
+ interaction start and finish is common for web-based client software.
+
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.example.net/return/123455",
+ "nonce": "LKLTI25DK82FX4T4QFZC"
+ }
+ }
+
+ In the following non-normative example, the client instance is
+ indicating that it can display a user code (Section 2.5.1.3) and
+ direct the end user to an arbitrary URI (Section 2.5.1.1), but it
+ cannot accept a redirect or push-style callback. This pattern is
+ common for devices that have robust display capabilities but expect
+ the use of a secondary device to facilitate end-user interaction with
+ the AS, such as a set-top box capable of displaying an interaction
+ URL as a QR code.
+
+ "interact": {
+ "start": ["redirect", "user_code"]
+ }
+
+ In the following non-normative example, the client instance is
+ indicating that it cannot start any interaction with the end user but
+ that the AS can push an interaction finish message (Section 2.5.2.2)
+ when authorization from the RO is received asynchronously. This
+ pattern is common for scenarios where a service needs to be
+ authorized, but the RO is able to be contacted separately from the
+ GNAP transaction itself, such as through a push notification or
+ existing interactive session on a secondary device.
+
+ "interact": {
+ "start": [],
+ "finish": {
+ "method": "push",
+ "uri": "https://client.example.net/return/123455",
+ "nonce": "LKLTI25DK82FX4T4QFZC"
+ }
+ }
+
+ If all of the following conditions are true, the AS MUST return an
+ invalid_interaction error (Section 3.6) since the client instance
+ will be unable to complete the request without authorization:
+
+ * The client instance does not provide a suitable interaction
+ mechanism.
+
+ * The AS cannot contact the RO asynchronously.
+
+ * The AS determines that interaction is required.
+
+2.5.1. Start Mode Definitions
+
+ If the client instance is capable of starting interaction with the
+ end user, the client instance indicates this by sending an array of
+ start modes under the start key. Each interaction start mode has a
+ unique identifying name. Interaction start modes are specified in
+ the array either by a string, which consists of the start mode name
+ on its own, or by a JSON object with the required field mode:
+
+ mode: The interaction start mode. REQUIRED.
+
+ Interaction start modes defined as objects MAY define additional
+ parameters to be required in the object.
+
+ The start array can contain both string-type and object-type modes.
+
+ This specification defines the following interaction start modes:
+
+ "redirect" (string): Indicates that the client instance can direct
+ the end user to an arbitrary URI for interaction. See
+ Section 2.5.1.1.
+
+ "app" (string): Indicates that the client instance can launch an
+ application on the end user's device for interaction. See
+ Section 2.5.1.2.
+
+ "user_code" (string): Indicates that the client instance can
+ communicate a short, human-readable code to the end user for use
+ with a stable URI. See Section 2.5.1.3.
+
+ "user_code_uri" (string): Indicates that the client instance can
+ communicate a short, human-readable code to the end user for use
+ with a short, dynamic URI. See Section 2.5.1.4.
+
+ Additional start modes can be defined in the "GNAP Interaction Start
+ Modes" registry (Section 10.9).
+
+2.5.1.1. Redirect to an Arbitrary URI
+
+ If the client instance is capable of directing the end user to a URI
+ defined by the AS at runtime, the client instance indicates this by
+ including redirect in the array under the start key. The means by
+ which the client instance will activate this URI are out of scope of
+ this specification, but common methods include an HTTP redirect,
+ launching a browser on the end user's device, providing a scannable
+ image encoding, and printing out a URI to an interactive console.
+ While this URI is generally hosted at the AS, the client instance can
+ make no assumptions about its contents, composition, or relationship
+ to the grant endpoint URI.
+
+ "interact": {
+ "start": ["redirect"]
+ }
+
+ If this interaction mode is supported for this client instance and
+ request, the AS returns a redirect interaction response
+ (Section 3.3.1). The client instance manages this interaction method
+ as described in Section 4.1.1.
+
+ See Section 11.29 for more considerations regarding the use of front-
+ channel communication techniques.
+
+2.5.1.2. Open an Application-Specific URI
+
+ If the client instance can open a URI associated with an application
+ on the end user's device, the client instance indicates this by
+ including app in the array under the start key. The means by which
+ the client instance determines the application to open with this URI
+ are out of scope of this specification.
+
+ "interact": {
+ "start": ["app"]
+ }
+
+ If this interaction mode is supported for this client instance and
+ request, the AS returns an app interaction response with an app URI
+ payload (Section 3.3.2). The client instance manages this
+ interaction method as described in Section 4.1.4.
+
+2.5.1.3. Display a Short User Code
+
+ If the client instance is capable of displaying or otherwise
+ communicating a short, human-entered code to the RO, the client
+ instance indicates this by including user_code in the array under the
+ start key. This code is to be entered at a static URI that does not
+ change at runtime. The client instance has no reasonable means to
+ communicate a dynamic URI to the RO, so this URI is usually
+ communicated out of band to the RO through documentation or other
+ messaging outside of GNAP. While this URI is generally hosted at the
+ AS, the client instance can make no assumptions about its contents,
+ composition, or relationship to the grant endpoint URI.
+
+ "interact": {
+ "start": ["user_code"]
+ }
+
+ If this interaction mode is supported for this client instance and
+ request, the AS returns a user code as specified in Section 3.3.3.
+ The client instance manages this interaction method as described in
+ Section 4.1.2.
+
+2.5.1.4. Display a Short User Code and URI
+
+ If the client instance is capable of displaying or otherwise
+ communicating a short, human-entered code along with a short, human-
+ entered URI to the RO, the client instance indicates this by
+ including user_code_uri in the array under the start key. This code
+ is to be entered at the dynamic URL given in the response. While
+ this URL is generally hosted at the AS, the client instance can make
+ no assumptions about its contents, composition, or relationship to
+ the grant endpoint URI.
+
+ "interact": {
+ "start": ["user_code_uri"]
+ }
+
+ If this interaction mode is supported for this client instance and
+ request, the AS returns a user code and interaction URL as specified
+ in Section 3.3.4. The client instance manages this interaction
+ method as described in Section 4.1.3.
+
+2.5.2. Interaction Finish Methods
+
+ If the client instance is capable of receiving a message from the AS
+ indicating that the RO has completed their interaction, the client
+ instance indicates this by sending the following members of an object
+ under the finish key.
+
+ method (string): The callback method that the AS will use to contact
+ the client instance. REQUIRED.
+
+ uri (string): Indicates the URI that the AS will use to signal the
+ client instance that interaction has completed. This URI MAY be
+ unique per request and MUST be hosted by or accessible to the
+ client instance. This URI MUST be an absolute URI and MUST NOT
+ contain any fragment component. If the client instance needs any
+ state information to tie to the front-channel interaction
+ response, it MUST use a unique callback URI to link to that
+ ongoing state. The allowable URIs and URI patterns MAY be
+ restricted by the AS based on the client instance's presented key
+ information. The callback URI SHOULD be presented to the RO
+ during the interaction phase before redirect. REQUIRED for
+ redirect and push methods.
+
+ nonce (string): Unique ASCII string value to be used in the
+ calculation of the "hash" query parameter sent to the callback
+ URI. It must be sufficiently random to be unguessable by an
+ attacker. It MUST be generated by the client instance as a unique
+ value for this request. REQUIRED.
+
+ hash_method (string): An identifier of a hash calculation mechanism
+ to be used for the callback hash in Section 4.2.3, as defined in
+ the IANA "Named Information Hash Algorithm Registry" [HASH-ALG].
+ If absent, the default value is sha-256. OPTIONAL.
+
+ This specification defines the following values for the method
+ parameter; additional values can be defined in the "GNAP Interaction
+ Finish Methods" registry (Section 10.10):
+
+ "redirect": Indicates that the client instance can receive a
+ redirect from the end user's device after interaction with the RO
+ has concluded. See Section 2.5.2.1.
+
+ "push": Indicates that the client instance can receive an HTTP POST
+ request from the AS after interaction with the RO has concluded.
+ See Section 2.5.2.2.
+
+ If interaction finishing is supported for this client instance and
+ request, the AS will return a nonce (Section 3.3.5) used by the
+ client instance to validate the callback. All interaction finish
+ methods MUST use this nonce to allow the client to verify the
+ connection between the pending interaction request and the callback.
+ GNAP does this through the use of the interaction hash, defined in
+ Section 4.2.3. All requests to the callback URI MUST be processed as
+ described in Section 4.2.
+
+ All interaction finish methods MUST require presentation of an
+ interaction reference for continuing this grant request. This means
+ that the interaction reference MUST be returned by the AS and MUST be
+ presented by the client as described in Section 5.1. The means by
+ which the interaction reference is returned to the client instance
+ are specific to the interaction finish method.
+
+2.5.2.1. Receive an HTTP Callback through the Browser
+
+ A finish method value of redirect indicates that the client instance
+ will expect a request from the RO's browser using the HTTP method GET
+ as described in Section 4.2.1.
+
+ The client instance's URI MUST be protected by HTTPS, be hosted on a
+ server local to the RO's browser ("localhost"), or use an
+ application-specific URI scheme that is loaded on the end user's
+ device.
+
+ "interact": {
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.example.net/return/123455",
+ "nonce": "LKLTI25DK82FX4T4QFZC"
+ }
+ }
+
+ Requests to the callback URI MUST be processed by the client instance
+ as described in Section 4.2.1.
+
+ Since the incoming request to the callback URI is from the RO's
+ browser, this method is usually used when the RO and end user are the
+ same entity. See Section 11.24 for considerations on ensuring the
+ incoming HTTP message matches the expected context of the request.
+ See Section 11.29 for more considerations regarding the use of front-
+ channel communication techniques.
+
+2.5.2.2. Receive an HTTP Direct Callback
+
+ A finish method value of push indicates that the client instance will
+ expect a request from the AS directly using the HTTP method POST as
+ described in Section 4.2.2.
+
+ The client instance's URI MUST be protected by HTTPS, be hosted on a
+ server local to the RO's browser ("localhost"), or use an
+ application-specific URI scheme that is loaded on the end user's
+ device.
+
+ "interact": {
+ "finish": {
+ "method": "push",
+ "uri": "https://client.example.net/return/123455",
+ "nonce": "LKLTI25DK82FX4T4QFZC"
+ }
+ }
+
+ Requests to the callback URI MUST be processed by the client instance
+ as described in Section 4.2.2.
+
+ Since the incoming request to the callback URI is from the AS and not
+ from the RO's browser, this request is not expected to have any
+ shared session information from the start method. See Sections 11.24
+ and 11.23 for more considerations regarding the use of back-channel
+ and polling mechanisms like this.
+
+2.5.3. Hints
+
+ The hints key is an object describing one or more suggestions from
+ the client instance that the AS can use to help drive user
+ interaction.
+
+ This specification defines the following property under the hints
+ key:
+
+ ui_locales (array of strings): Indicates the end user's preferred
+ locales that the AS can use during interaction, particularly
+ before the RO has authenticated. OPTIONAL. Section 2.5.3.1
+
+ The following subsection details requests for interaction hints.
+ Additional interaction hints can be defined in the "GNAP Interaction
+ Hints" registry (Section 10.11).
+
+2.5.3.1. Indicate Desired Interaction Locales
+
+ If the client instance knows the end user's locale and language
+ preferences, the client instance can send this information to the AS
+ using the ui_locales field with an array of locale strings as defined
+ by [RFC5646].
+
+ "interact": {
+ "hints": {
+ "ui_locales": ["en-US", "fr-CA"]
+ }
+ }
+
+ If possible, the AS SHOULD use one of the locales in the array, with
+ preference to the first item in the array supported by the AS. If
+ none of the given locales are supported, the AS MAY use a default
+ locale.
+
+3. Grant Response
+
+ In response to a client instance's request, the AS responds with a
+ JSON object as the HTTP content. Each possible field is detailed in
+ the subsections below.
+
+ continue (object): Indicates that the client instance can continue
+ the request by making one or more continuation requests. REQUIRED
+ if continuation calls are allowed for this client instance on this
+ grant request. See Section 3.1.
+
+ access_token (object / array of objects): A single access token or
+ set of access tokens that the client instance can use to call the
+ RS on behalf of the RO. REQUIRED if an access token is included.
+ See Section 3.2.
+
+ interact (object): Indicates that interaction through some set of
+ defined mechanisms needs to take place. REQUIRED if interaction
+ is expected. See Section 3.3.
+
+ subject (object): Claims about the RO as known and declared by the
+ AS. REQUIRED if subject information is included. See
+ Section 3.4.
+
+ instance_id (string): An identifier this client instance can use to
+ identify itself when making future requests. OPTIONAL. See
+ Section 3.5.
+
+ error (object or string): An error code indicating that something
+ has gone wrong. REQUIRED for an error condition. See
+ Section 3.6.
+
+ Additional fields can be defined by extensions to GNAP in the "GNAP
+ Grant Response Parameters" registry (Section 10.12).
+
+ In the following non-normative example, the AS is returning an
+ interaction URI (Section 3.3.1), a callback nonce (Section 3.3.5),
+ and a continuation response (Section 3.1).
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ {
+ "interact": {
+ "redirect": "https://server.example.com/interact/4CF492ML\
+ VMSW9MKMXKHQ",
+ "finish": "MBDOFXG4Y5CVJCX821LH"
+ },
+ "continue": {
+ "access_token": {
+ "value": "80UPRY5NM33OMUKMKSKU",
+ },
+ "uri": "https://server.example.com/tx"
+ }
+ }
+
+ In the following non-normative example, the AS is returning a bearer
+ access token (Section 3.2.1) with a management URI and a Subject
+ Identifier (Section 3.4) in the form of an opaque identifier.
+
+ {
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "flags": ["bearer"],
+ "manage": {
+ "uri": "https://server.example.com/token/PRY5NM33O",
+ "access_token": {
+ "value": "B8CDFONP21-4TB8N6.BW7ONM"
+ }
+ }
+ },
+ "subject": {
+ "sub_ids": [ {
+ "format": "opaque",
+ "id": "J2G8G8O4AZ"
+ } ]
+ }
+ }
+
+ In the following non-normative example, the AS is returning set of
+ Subject Identifiers (Section 3.4), simultaneously as an opaque
+ identifier, an email address, and a decentralized identifier (DID),
+ formatted as a set of Subject Identifiers as defined in [RFC9493].
+
+ {
+ "subject": {
+ "sub_ids": [ {
+ "format": "opaque",
+ "id": "J2G8G8O4AZ"
+ }, {
+ "format": "email",
+ "email": "user@example.com"
+ }, {
+ "format": "did",
+ "url": "did:example:123456"
+ } ]
+ }
+ }
+
+ The response MUST be sent as a JSON object in the content of the HTTP
+ response with Content-Type application/json, unless otherwise
+ specified by the specific response (e.g., an empty response with no
+ Content-Type).
+
+ The AS MUST include the HTTP Cache-Control response header field
+ [RFC9111] with a value set to "no-store".
+
+3.1. Request Continuation
+
+ If the AS determines that the grant request can be continued by the
+ client instance, the AS responds with the continue field. This field
+ contains a JSON object with the following properties.
+
+ uri (string): The URI at which the client instance can make
+ continuation requests. This URI MAY vary per request or MAY be
+ stable at the AS. This URI MUST be an absolute URI. The client
+ instance MUST use this value exactly as given when making a
+ continuation request (Section 5). REQUIRED.
+
+ wait (integer): The amount of time in integer seconds the client
+ instance MUST wait after receiving this request continuation
+ response and calling the continuation URI. The value SHOULD NOT
+ be less than five seconds, and omission of the value MUST be
+ interpreted as five seconds. RECOMMENDED.
+
+ access_token (object): A unique access token for continuing the
+ request, called the "continuation access token". The value of
+ this property MUST be an object in the format specified in
+ Section 3.2.1. This access token MUST be bound to the client
+ instance's key used in the request and MUST NOT be a bearer token.
+ As a consequence, the flags array of this access token MUST NOT
+ contain the string bearer, and the key field MUST be omitted.
+ This access token MUST NOT have a manage field. The client
+ instance MUST present the continuation access token in all
+ requests to the continuation URI as described in Section 7.2.
+ REQUIRED.
+
+ {
+ "continue": {
+ "access_token": {
+ "value": "80UPRY5NM33OMUKMKSKU"
+ },
+ "uri": "https://server.example.com/continue",
+ "wait": 60
+ }
+ }
+
+ This field is REQUIRED if the grant request is in the _pending_
+ state, as the field contains the information needed by the client
+ request to continue the request as described in Section 5. Note that
+ the continuation access token is bound to the client instance's key;
+ therefore, the client instance MUST sign all continuation requests
+ with its key as described in Section 7.3 and MUST present the
+ continuation access token in its continuation request.
+
+3.2. Access Tokens
+
+ If the AS has successfully granted one or more access tokens to the
+ client instance, the AS responds with the access_token field. This
+ field contains either a single access token as described in
+ Section 3.2.1 or an array of access tokens as described in
+ Section 3.2.2.
+
+ The client instance uses any access tokens in this response to call
+ the RS as described in Section 7.2.
+
+ The grant request MUST be in the _approved_ state to include this
+ field in the response.
+
+3.2.1. Single Access Token
+
+ If the client instance has requested a single access token and the AS
+ has granted that access token, the AS responds with the
+ "access_token" field. The value of this field is an object with the
+ following properties.
+
+ value (string): The value of the access token as a string. The
+ value is opaque to the client instance. The value MUST be limited
+ to the token68 character set defined in Section 11.2 of [HTTP] to
+ facilitate transmission over HTTP headers and within other
+ protocols without requiring additional encoding. REQUIRED.
+
+ label (string): The value of the label the client instance provided
+ in the associated token request (Section 2.1), if present.
+ REQUIRED for multiple access tokens or if a label was included in
+ the single access token request; OPTIONAL for a single access
+ token where no label was included in the request.
+
+ manage (object): Access information for the token management API for
+ this access token. If provided, the client instance MAY manage
+ its access token as described in Section 6. This management API
+ is a function of the AS and is separate from the RS the client
+ instance is requesting access to. OPTIONAL.
+
+ access (array of objects/strings): A description of the rights
+ associated with this access token, as defined in Section 8. If
+ included, this MUST reflect the rights associated with the issued
+ access token. These rights MAY vary from what was requested by
+ the client instance. REQUIRED.
+
+ expires_in (integer): The number of seconds in which the access will
+ expire. The client instance MUST NOT use the access token past
+ this time. Note that the access token MAY be revoked by the AS or
+ RS at any point prior to its expiration. OPTIONAL.
+
+ key (object / string): The key that the token is bound to, if
+ different from the client instance's presented key. The key MUST
+ be an object or string in a format described in Section 7.1. The
+ client instance MUST be able to dereference or process the key
+ information in order to be able to sign subsequent requests using
+ the access token (Section 7.2). When the key is provided by value
+ from the AS, the token shares some security properties with bearer
+ tokens as discussed in Section 11.38. It is RECOMMENDED that keys
+ returned for use with access tokens be key references as described
+ in Section 7.1.1 that the client instance can correlate to its
+ known keys. OPTIONAL.
+
+ flags (array of strings): A set of flags that represent attributes
+ or behaviors of the access token issued by the AS. OPTIONAL.
+
+ The value of the manage field is an object with the following
+ properties:
+
+ uri (string): The URI of the token management API for this access
+ token. This URI MUST be an absolute URI. This URI MUST NOT
+ include the value of the access token being managed or the value
+ of the access token used to protect the URI. This URI SHOULD be
+ different for each access token issued in a request. REQUIRED.
+
+ access_token (object): A unique access token for continuing the
+ request, called the "token management access token". The value of
+ this property MUST be an object in the format specified in
+ Section 3.2.1. This access token MUST be bound to the client
+ instance's key used in the request (or its most recent rotation)
+ and MUST NOT be a bearer token. As a consequence, the flags array
+ of this access token MUST NOT contain the string bearer, and the
+ key field MUST be omitted. This access token MUST NOT have a
+ manage field. This access token MUST NOT have the same value as
+ the token it is managing. The client instance MUST present the
+ continuation access token in all requests to the continuation URI
+ as described in Section 7.2. REQUIRED.
+
+ The values of the flags field defined by this specification are as
+ follows:
+
+ "bearer": Flag indicating whether the token is a bearer token, not
+ bound to a key and proofing mechanism. If the bearer flag is
+ present, the access token is a bearer token, and the key field in
+ this response MUST be omitted. See Section 11.9 for additional
+ considerations on the use of bearer tokens.
+
+ "durable": Flag indicating a hint of AS behavior on token rotation.
+ If this flag is present, then the client instance can expect a
+ previously issued access token to continue to work after it has
+ been rotated (Section 6.1) or the underlying grant request has
+ been modified (Section 5.3), resulting in the issuance of new
+ access tokens. If this flag is omitted, the client instance can
+ anticipate a given access token could stop working after token
+ rotation or grant request modification. Note that a token flagged
+ as durable can still expire or be revoked through any normal
+ means.
+
+ Flag values MUST NOT be included more than once.
+
+ Additional flags can be defined by extensions using the "GNAP Access
+ Token Flags" registry (Section 10.4).
+
+ If the bearer flag and the key field in this response are omitted,
+ the token is bound to the key used by the client instance
+ (Section 2.3) in its request for access. If the bearer flag is
+ omitted and the key field is present, the token is bound to the key
+ and proofing mechanism indicated in the key field. The means by
+ which the AS determines how to bind an access token to a key other
+ than that presented by the client instance are out of scope for this
+ specification, but common practices include pre-registering specific
+ keys in a static fashion.
+
+ The client software MUST reject any access token where the flags
+ field contains the bearer flag and the key field is present with any
+ value.
+
+ The following non-normative example shows a single access token bound
+ to the client instance's key used in the initial request. The access
+ token has a management URI and has access to three described
+ resources (one using an object and two described by reference
+ strings).
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "manage": {
+ "uri": "https://server.example.com/token/PRY5NM33O",
+ "access_token": {
+ "value": "B8CDFONP21-4TB8N6.BW7ONM"
+ }
+ },
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [
+ "read",
+ "write",
+ "dolphin"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ]
+ },
+ "read", "dolphin-metadata"
+ ]
+ }
+
+ The following non-normative example shows a single bearer access
+ token with access to two described resources.
+
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "flags": ["bearer"],
+ "access": [
+ "finance", "medical"
+ ]
+ }
+
+ If the client instance requested a single access token
+ (Section 2.1.1), the AS MUST NOT respond with the structure for
+ multiple access tokens.
+
+3.2.2. Multiple Access Tokens
+
+ If the client instance has requested multiple access tokens and the
+ AS has granted at least one of them, the AS responds with the
+ "access_token" field. The value of this field is a JSON array, the
+ members of which are distinct access tokens as described in
+ Section 3.2.1. Each object MUST have a unique label field,
+ corresponding to the token labels chosen by the client instance in
+ the request for multiple access tokens (Section 2.1.2).
+
+ In the following non-normative example, two tokens are issued under
+ the names token1 and token2, and only the first token has a
+ management URI associated with it.
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ "access_token": [
+ {
+ "label": "token1",
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "manage": {
+ "uri": "https://server.example.com/token/PRY5NM33O",
+ "access_token": {
+ "value": "B8CDFONP21-4TB8N6.BW7ONM"
+ }
+ },
+ "access": [ "finance" ]
+ },
+ {
+ "label": "token2",
+ "value": "UFGLO2FDAFG7VGZZPJ3IZEMN21EVU71FHCARP4J1",
+ "access": [ "medical" ]
+ }
+ }
+
+ Each access token corresponds to one of the objects in the
+ access_token array of the client instance's request (Section 2.1.2).
+
+ The AS MAY refuse to issue one or more of the requested access tokens
+ for any reason. In such cases, the refused token is omitted from the
+ response, and all of the other issued access tokens are included in
+ the response under their respective requested labels. If the client
+ instance requested multiple access tokens (Section 2.1.2), the AS
+ MUST NOT respond with a single access token structure, even if only a
+ single access token is granted. In such cases, the AS MUST respond
+ with a structure for multiple access tokens containing one access
+ token.
+
+ "access_token": [
+ {
+ "label": "token2",
+ "value": "8N6BW7OZB8CDFONP219-OS9M2PMHKUR64TBRP1LT0",
+ "manage": {
+ "uri": "https://server.example.com/token/PRY5NM33O",
+ "access_token": {
+ "value": "B8CDFONP21-4TB8N6.BW7ONM"
+ }
+ },
+ "access": [ "fruits" ]
+ }
+ ]
+
+ The parameters of each access token are separate. For example, each
+ access token is expected to have a unique value and (if present)
+ label, and each access token likely has different access rights
+ associated with it. Each access token could also be bound to
+ different keys with different proofing mechanisms.
+
+3.3. Interaction Modes
+
+ If the client instance has indicated a capability to interact with
+ the RO in its request (Section 2.5) and the AS has determined that
+ interaction is both supported and necessary, the AS responds to the
+ client instance with any of the following values in the interact
+ field of the response. There is no preference order for interaction
+ modes in the response, and it is up to the client instance to
+ determine which ones to use. All supported interaction methods are
+ included in the same interact object.
+
+ redirect (string): Redirect to an arbitrary URI. REQUIRED if the
+ redirect interaction start mode is possible for this request. See
+ Section 3.3.1.
+
+ app (string): Launch of an application URI. REQUIRED if the app
+ interaction start mode is possible for this request. See
+ Section 3.3.2.
+
+ user_code (string): Display a short user code. REQUIRED if the
+ user_code interaction start mode is possible for this request.
+ See Section 3.3.3.
+
+ user_code_uri (object): Display a short user code and URI. REQUIRED
+ if the user_code_uri interaction start mode is possible for this
+ request. Section 3.3.4
+
+ finish (string): A unique ASCII string value provided by the AS as a
+ nonce. This is used by the client instance to verify the callback
+ after interaction is completed. REQUIRED if the interaction
+ finish method requested by the client instance is possible for
+ this request. See Section 3.3.5.
+
+ expires_in (integer): The number of integer seconds after which this
+ set of interaction responses will expire and no longer be usable
+ by the client instance. If the interaction methods expire, the
+ client MAY restart the interaction process for this grant request
+ by sending an update (Section 5.3) with a new interaction request
+ field (Section 2.5). OPTIONAL. If omitted, the interaction
+ response modes returned do not expire but MAY be invalidated by
+ the AS at any time.
+
+ Additional interaction mode responses can be defined in the "GNAP
+ Interaction Mode Responses" registry (Section 10.13).
+
+ The AS MUST NOT respond with any interaction mode that the client
+ instance did not indicate in its request, and the AS MUST NOT respond
+ with any interaction mode that the AS does not support. Since
+ interaction responses include secret or unique information, the AS
+ SHOULD respond to each interaction mode only once in an ongoing
+ request, particularly if the client instance modifies its request
+ (Section 5.3).
+
+ The grant request MUST be in the _pending_ state to include this
+ field in the response.
+
+3.3.1. Redirection to an Arbitrary URI
+
+ If the client instance indicates that it can redirect to an arbitrary
+ URI (Section 2.5.1.1) and the AS supports this mode for the client
+ instance's request, the AS responds with the "redirect" field, which
+ is a string containing the URI for the end user to visit. This URI
+ MUST be unique for the request and MUST NOT contain any security-
+ sensitive information such as user identifiers or access tokens.
+
+ "interact": {
+ "redirect": "https://interact.example.com/4CF492MLVMSW9MKMXKHQ"
+ }
+
+ The URI returned is a function of the AS, but the URI itself MAY be
+ completely distinct from the grant endpoint URI that the client
+ instance uses to request access (Section 2), allowing an AS to
+ separate its user-interaction functionality from its backend security
+ functionality. The AS will need to dereference the specific grant
+ request and its information from the URI alone. If the AS does not
+ directly host the functionality accessed through the redirect URI,
+ then the means for the interaction functionality to communicate with
+ the rest of the AS are out of scope for this specification.
+
+ The client instance sends the end user to the URI to interact with
+ the AS. The client instance MUST NOT alter the URI in any way. The
+ means for the client instance to send the end user to this URI are
+ out of scope of this specification, but common methods include an
+ HTTP redirect, launching the system browser, displaying a scannable
+ code, or printing out the URI in an interactive console. See details
+ of the interaction in Section 4.1.1.
+
+3.3.2. Launch of an Application URI
+
+ If the client instance indicates that it can launch an application
+ URI (Section 2.5.1.2) and the AS supports this mode for the client
+ instance's request, the AS responds with the "app" field, which is a
+ string containing the URI for the client instance to launch. This
+ URI MUST be unique for the request and MUST NOT contain any security-
+ sensitive information such as user identifiers or access tokens.
+
+ "interact": {
+ "app": "https://app.example.com/launch?tx=4CF492MLV"
+ }
+
+ The means for the launched application to communicate with the AS are
+ out of scope for this specification.
+
+ The client instance launches the URI as appropriate on its platform;
+ the means for the client instance to launch this URI are out of scope
+ of this specification. The client instance MUST NOT alter the URI in
+ any way. The client instance MAY attempt to detect if an installed
+ application will service the URI being sent before attempting to
+ launch the application URI. See details of the interaction in
+ Section 4.1.4.
+
+3.3.3. Display of a Short User Code
+
+ If the client instance indicates that it can display a short, user-
+ typeable code (Section 2.5.1.3) and the AS supports this mode for the
+ client instance's request, the AS responds with a "user_code" field.
+ This field is string containing a unique short code that the user can
+ type into a web page. To facilitate usability, this string MUST
+ consist only of characters that can be easily typed by the end user
+ (such as ASCII letters or numbers) and MUST be processed by the AS in
+ a case-insensitive manner (see Section 4.1.2). The string MUST be
+ randomly generated so as to be unguessable by an attacker within the
+ time it is accepted. The time in which this code will be accepted
+ SHOULD be short lived, such as several minutes. It is RECOMMENDED
+ that this code be between six and eight characters in length.
+
+ "interact": {
+ "user_code": "A1BC3DFF"
+ }
+
+ The client instance MUST communicate the "user_code" value to the end
+ user in some fashion, such as displaying it on a screen or reading it
+ out audibly. This code is used by the interaction component of the
+ AS as a means of identifying the pending grant request and does not
+ function as an authentication factor for the RO.
+
+ The URI that the end user is intended to enter the code into MUST be
+ stable, since the client instance is expected to have no means of
+ communicating a dynamic URI to the end user at runtime.
+
+ As this interaction mode is designed to facilitate interaction via a
+ secondary device, it is not expected that the client instance
+ redirect the end user to the URI where the code is entered. If the
+ client instance is capable of communicating a short arbitrary URI to
+ the end user for use with the user code, the client instance SHOULD
+ instead use the "user_code_uri" mode (Section 2.5.1.4). If the
+ client instance is capable of communicating a long arbitrary URI to
+ the end user, such as through a scannable code, the client instance
+ SHOULD use the "redirect" mode (Section 2.5.1.1) for this purpose,
+ instead of or in addition to the user code mode.
+
+ See details of the interaction in Section 4.1.2.
+
+3.3.4. Display of a Short User Code and URI
+
+ If the client instance indicates that it can display a short, user-
+ typeable code (Section 2.5.1.3) and the AS supports this mode for the
+ client instance's request, the AS responds with a "user_code_uri"
+ object that contains the following members.
+
+ code (string): A unique short code that the end user can type into a
+ provided URI. To facilitate usability, this string MUST consist
+ only of characters that can be easily typed by the end user (such
+ as ASCII letters or numbers) and MUST be processed by the AS in a
+ case-insensitive manner (see Section 4.1.3). The string MUST be
+ randomly generated so as to be unguessable by an attacker within
+ the time it is accepted. The time in which this code will be
+ accepted SHOULD be short lived, such as several minutes. It is
+ RECOMMENDED that this code be between six and eight characters in
+ length. REQUIRED.
+
+ uri (string): The interaction URI that the client instance will
+ direct the RO to. This URI MUST be short enough to be
+ communicated to the end user by the client instance. It is
+ RECOMMENDED that this URI be short enough for an end user to type
+ in manually. The URI MUST NOT contain the code value. This URI
+ MUST be an absolute URI. REQUIRED.
+
+ "interact": {
+ "user_code_uri": {
+ "code": "A1BC3DFF",
+ "uri": "https://s.example/device"
+ }
+ }
+
+ The client instance MUST communicate the "code" to the end user in
+ some fashion, such as displaying it on a screen or reading it out
+ audibly. This code is used by the interaction component of the AS as
+ a means of identifying the pending grant request and does not
+ function as an authentication factor for the RO.
+
+ The client instance MUST also communicate the URI to the end user.
+ Since it is expected that the end user will continue interaction on a
+ secondary device, the URI needs to be short enough to allow the end
+ user to type or copy it to a secondary device without mistakes.
+
+ The URI returned is a function of the AS, but the URI itself MAY be
+ completely distinct from the grant endpoint URI that the client
+ instance uses to request access (Section 2), allowing an AS to
+ separate its user-interaction functionality from its backend security
+ functionality. If the AS does not directly host the functionality
+ accessed through the given URI, then the means for the interaction
+ functionality to communicate with the rest of the AS are out of scope
+ for this specification.
+
+ See details of the interaction in Section 4.1.2.
+
+3.3.5. Interaction Finish
+
+ If the client instance indicates that it can receive a post-
+ interaction redirect or push at a URI (Section 2.5.2) and the AS
+ supports this mode for the client instance's request, the AS responds
+ with a finish field containing a nonce that the client instance will
+ use in validating the callback as defined in Section 4.2.
+
+ "interact": {
+ "finish": "MBDOFXG4Y5CVJCX821LH"
+ }
+
+ When the interaction is completed, the interaction component of the
+ AS MUST contact the client instance using the means defined by the
+ finish method as described in Section 4.2.
+
+ If the AS returns the finish field, the client instance MUST NOT
+ continue a grant request before it receives the associated
+ interaction reference on the callback URI. See details in
+ Section 4.2.
+
+3.4. Returning Subject Information
+
+ If information about the RO is requested and the AS grants the client
+ instance access to that data, the AS returns the approved information
+ in the "subject" response field. The AS MUST return the subject
+ field only in cases where the AS is sure that the RO and the end user
+ are the same party. This can be accomplished through some forms of
+ interaction with the RO (Section 4).
+
+ This field is an object with the following properties.
+
+ sub_ids (array of objects): An array of Subject Identifiers for the
+ RO, as defined by [RFC9493]. REQUIRED if returning Subject
+ Identifiers.
+
+ assertions (array of objects): An array containing assertions as
+ objects, each containing the assertion object described below.
+ REQUIRED if returning assertions.
+
+ updated_at (string): Timestamp as a date string as described in
+ [RFC3339], indicating when the identified account was last
+ updated. The client instance MAY use this value to determine if
+ it needs to request updated profile information through an
+ identity API. The definition of such an identity API is out of
+ scope for this specification. RECOMMENDED.
+
+ Assertion objects contain the following fields:
+
+ format (string): The assertion format. Possible formats are listed
+ in Section 3.4.1. Additional assertion formats can be defined in
+ the "GNAP Assertion Formats" registry (Section 10.6). REQUIRED.
+
+ value (string): The assertion value as the JSON string serialization
+ of the assertion. REQUIRED.
+
+ The following non-normative example contains an opaque identifier and
+ an OpenID Connect ID Token:
+
+ "subject": {
+ "sub_ids": [ {
+ "format": "opaque",
+ "id": "XUT2MFM1XBIKJKSDU8QM"
+ } ],
+ "assertions": [ {
+ "format": "id_token",
+ "value": "eyj..."
+ } ]
+ }
+
+ Subject Identifiers returned by the AS SHOULD uniquely identify the
+ RO at the AS. Some forms of Subject Identifiers are opaque to the
+ client instance (such as the subject of an issuer and subject pair),
+ while other forms (such as email address and phone number) are
+ intended to allow the client instance to correlate the identifier
+ with other account information at the client instance. The client
+ instance MUST NOT request or use any returned Subject Identifiers for
+ communication purposes (see Section 2.2). That is, a Subject
+ Identifier returned in the format of an email address or a phone
+ number only identifies the RO to the AS and does not indicate that
+ the AS has validated that the represented email address or phone
+ number in the identifier is suitable for communication with the
+ current user. To get such information, the client instance MUST use
+ an identity protocol to request and receive additional identity
+ claims. The details of an identity protocol and associated schema
+ are outside the scope of this specification.
+
+ The AS MUST ensure that the returned subject information represents
+ the RO. In most cases, the AS will also ensure that the returned
+ subject information represents the end user authenticated
+ interactively at the AS. The AS SHOULD NOT reuse Subject Identifiers
+ for multiple different ROs.
+
+ The "sub_ids" and "assertions" response fields are independent of
+ each other. That is, a returned assertion MAY use a different
+ Subject Identifier than other assertions and Subject Identifiers in
+ the response. However, all Subject Identifiers and assertions
+ returned MUST refer to the same party.
+
+ The client instance MUST interpret all subject information in the
+ context of the AS from which the subject information is received, as
+ is discussed in Section 6 of [SP80063C]. For example, one AS could
+ return an email identifier of "user@example.com" for one RO, and a
+ different AS could return that same email identifier of
+ "user@example.com" for a completely different RO. A client instance
+ talking to both ASes needs to differentiate between these two
+ accounts by accounting for the AS source of each identifier and not
+ assuming that either has a canonical claim on the identifier without
+ additional configuration and trust agreements. Otherwise, a rogue AS
+ could exploit this to take over a targeted account asserted by a
+ different AS.
+
+ Extensions to this specification MAY define additional response
+ properties in the "GNAP Subject Information Response Fields" registry
+ (Section 10.14).
+
+ The grant request MUST be in the _approved_ state to return this
+ field in the response.
+
+ See Section 11.30 for considerations that the client instance has to
+ make when accepting and processing assertions from the AS.
+
+3.4.1. Assertion Formats
+
+ The following assertion formats are defined in this specification:
+
+ id_token: An OpenID Connect ID Token [OIDC], in JSON Web Token (JWT)
+ compact format as a single string.
+
+ saml2: A SAML 2.0 assertion [SAML2], encoded as a single base64url
+ string with no padding.
+
+3.5. Returning a Dynamically Bound Client Instance Identifier
+
+ Many parts of the client instance's request can be passed as either a
+ value or a reference. The use of a reference in place of a value
+ allows for a client instance to optimize requests to the AS.
+
+ Some references, such as for the client instance's identity
+ (Section 2.3.1) or the requested resources (Section 8.1), can be
+ managed statically through an admin console or developer portal
+ provided by the AS or RS. The developer of the client software can
+ include these values in their code for a more efficient and compact
+ request.
+
+ If desired, the AS MAY also generate and return an instance
+ identifier dynamically to the client instance in the response to
+ facilitate multiple interactions with the same client instance over
+ time. The client instance SHOULD use this instance identifier in
+ future requests in lieu of sending the associated data values in the
+ client field.
+
+ Dynamically generated client instance identifiers are string values
+ that MUST be protected by the client instance as secrets. Instance
+ identifier values MUST be unguessable and MUST NOT contain any
+ information that would compromise any party if revealed. Instance
+ identifier values are opaque to the client instance, and their
+ content is determined by the AS. The instance identifier MUST be
+ unique per client instance at the AS.
+
+ instance_id (string): A string value used to represent the
+ information in the client object that the client instance can use
+ in a future request, as described in Section 2.3.1. OPTIONAL.
+
+ The following non-normative example shows an instance identifier
+ alongside an issued access token.
+
+ {
+ "instance_id": "7C7C4AZ9KHRS6X63AJAO",
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0"
+ }
+ }
+
+3.6. Error Response
+
+ If the AS determines that the request cannot be completed for any
+ reason, it responds to the client instance with an error field in the
+ response message. This field is either an object or a string.
+
+ When returned as an object, the object contains the following fields:
+
+ code (string): A single ASCII error code defining the error. The
+ value MUST be defined in the "GNAP Error Codes" registry
+ (Section 10.15). REQUIRED.
+
+ description (string): A human-readable string description of the
+ error intended for the developer of the client. The value is
+ chosen by the implementation. OPTIONAL.
+
+ This specification defines the following code values:
+
+ "invalid_request": The request is missing a required parameter,
+ includes an invalid parameter value, or is otherwise malformed.
+
+ "invalid_client": The request was made from a client that was not
+ recognized or allowed by the AS, or the client's signature
+ validation failed.
+
+ "invalid_interaction": The client instance has provided an
+ interaction reference that is incorrect for this request, or the
+ interaction modes in use have expired.
+
+ "invalid_flag": The flag configuration is not valid.
+
+ "invalid_rotation": The token rotation request is not valid.
+
+ "key_rotation_not_supported": The AS does not allow rotation of this
+ access token's key.
+
+ "invalid_continuation": The continuation of the referenced grant
+ could not be processed.
+
+ "user_denied": The RO denied the request.
+
+ "request_denied": The request was denied for an unspecified reason.
+
+ "unknown_user": The user presented in the request is not known to
+ the AS or does not match the user present during interaction.
+
+ "unknown_interaction": The interaction integrity could not be
+ established.
+
+ "too_fast": The client instance did not respect the timeout in the
+ wait response before the next call.
+
+ "too_many_attempts": A limit has been reached in the total number of
+ reasonable attempts. This number is either defined statically or
+ adjusted based on runtime conditions by the AS.
+
+ Additional error codes can be defined in the "GNAP Error Codes"
+ registry (Section 10.15).
+
+ For example, if the RO denied the request while interacting with the
+ AS, the AS would return the following error when the client instance
+ tries to continue the grant request:
+
+ {
+ "error": {
+ "code": "user_denied",
+ "description": "The RO denied the request"
+ }
+ }
+
+ Alternatively, the AS MAY choose to only return the error as codes
+ and provide the error as a string. Since the description field is
+ not intended to be machine-readable, the following response is
+ considered functionally equivalent to the previous example for the
+ purposes of the client software's understanding:
+
+ {
+ "error": "user_denied"
+ }
+
+ If an error state is reached but the grant is in the _pending_ state
+ (and therefore the client instance can continue), the AS MAY include
+ the continue field in the response along with the error, as defined
+ in Section 3.1. This allows the client instance to modify its
+ request for access, potentially leading to prompting the RO again.
+ Other fields MUST NOT be included in the response.
+
+4. Determining Authorization and Consent
+
+ When the client instance makes its initial request (Section 2) to the
+ AS for delegated access, it is capable of asking for several
+ different kinds of information in response:
+
+ * the access being requested, in the access_token request parameter
+
+ * the subject information being requested, in the subject request
+ parameter
+
+ * any additional requested information defined by extensions of this
+ protocol
+
+ When the grant request is in the _processing_ state, the AS
+ determines what authorizations and consents are required to fulfill
+ this requested delegation. The details of how the AS makes this
+ determination are out of scope for this document. However, there are
+ several common patterns defined and supported by GNAP for fulfilling
+ these requirements, including information sent by the client
+ instance, information gathered through the interaction process, and
+ information supplied by external parties. An individual AS can
+ define its own policies and processes for deciding when and how to
+ gather the necessary authorizations and consent and how those are
+ applied to the grant request.
+
+ To facilitate the AS fulfilling this request, the client instance
+ sends information about the actions the client software can take,
+ including:
+
+ * starting interaction with the end user, in the interact request
+ parameter
+
+ * receiving notification that interaction with the RO has concluded,
+ in the interact request parameter
+
+ * any additional capabilities defined by extensions of this protocol
+
+ The client instance can also supply information directly to the AS in
+ its request. The client instance can send several kinds of things,
+ including:
+
+ * the identity of the client instance, known from the keys or
+ identifiers in the client request parameter
+
+ * the identity of the end user, in the user request parameter
+
+ * any additional information presented by the client instance in the
+ request defined by extensions of this protocol
+
+ The AS will process this presented information in the context of the
+ client instance's request and can only trust the information as much
+ as it trusts the presentation and context of that request. If the AS
+ determines that the information presented in the initial request is
+ sufficient for granting the requested access, the AS MAY move the
+ grant request to the _approved_ state and return results immediately
+ in its response (Section 3) with access tokens and subject
+ information.
+
+ If the AS determines that additional runtime authorization is
+ required, the AS can either deny the request outright (if there is no
+ possible recovery) or move the grant request to the _pending_ state
+ and use a number of means at its disposal to gather that
+ authorization from the appropriate ROs, including:
+
+ * starting interaction with the end user facilitated by the client
+ software, such as a redirection or user code
+
+ * challenging the client instance through a challenge-response
+ mechanism
+
+ * requesting that the client instance present specific additional
+ information, such as a user's credential or an assertion
+
+ * contacting an RO through an out-of-band mechanism, such as a push
+ notification
+
+ * executing an auxiliary software process through an out-of-band
+ mechanism, such as querying a digital wallet
+
+ The process of gathering authorization and consent in GNAP is left
+ deliberately flexible to allow for a wide variety of different
+ deployments, interactions, and methodologies. In this process, the
+ AS can gather consent from the RO or apply the RO's policy as
+ necessitated by the access that has been requested. The AS can
+ sometimes determine which RO needs to prompt for consent based on
+ what has been requested by the client instance, such as a specific RS
+ record, an identified subject, or a request requiring specific access
+ such as approval by an administrator. In other cases, the request is
+ applied to whichever RO is present at the time of consent gathering.
+ This pattern is especially prevalent when the end user is sent to the
+ AS for an interactive session, during which the end user takes on the
+ role of the RO. In these cases, the end user is delegating their own
+ access as RO to the client instance.
+
+ The client instance can indicate that it is capable of facilitating
+ interaction with the end user, another party, or another piece of
+ software through its interaction start request (Section 2.5.1).
+ Here, the AS usually needs to interact directly with the end user to
+ determine their identity, determine their status as an RO, and
+ collect their consent. If the AS has determined that authorization
+ is required and the AS can support one or more of the requested
+ interaction start methods, the AS returns the associated interaction
+ start responses (Section 3.3). The client instance SHOULD initiate
+ one or more of these interaction methods (Section 4.1) in order to
+ facilitate the granting of the request. If more than one interaction
+ start method is available, the means by which the client chooses
+ which methods to follow are out of scope of this specification.
+
+ After starting interaction, the client instance can then make a
+ continuation request (Section 5) either in response to a signal
+ indicating the finish of the interaction (Section 4.2), after a time-
+ based polling, or through some other method defined by an extension
+ of this specification through the "GNAP Interaction Mode Responses"
+ registry (Section 10.13).
+
+ If the grant request is not in the _approved_ state, the client
+ instance can repeat the interaction process by sending a grant update
+ request (Section 5.3) with new interaction methods (Section 2.5).
+
+ The client instance MUST use each interaction method once at most if
+ a response can be detected. The AS MUST handle any interact request
+ as a one-time-use mechanism and SHOULD apply suitable timeouts to any
+ interaction start methods provided, including user codes and
+ redirection URIs. The client instance SHOULD apply suitable timeouts
+ to any interaction finish method.
+
+ In order to support client software deployed in disadvantaged network
+ conditions, the AS MAY allow for processing of the same interaction
+ method multiple times if the AS can determine that the request is
+ from the same party and the results are idempotent. For example, if
+ a client instance launches a redirect to the AS but does not receive
+ a response within a reasonable time, the client software can launch
+ the redirect again, assuming that it never reached the AS in the
+ first place. However, if the AS in question receives both requests,
+ it could mistakenly process them separately, creating an undefined
+ state for the client instance. If the AS can determine that both
+ requests come from the same origin or under the same session, and the
+ requests both came before any additional state change to the grant
+ occurs, the AS can reasonably conclude that the initial response was
+ not received and the same response can be returned to the client
+ instance.
+
+ If the AS instead has a means of contacting the RO directly, it could
+ do so without involving the client instance in its consent-gathering
+ process. For example, the AS could push a notification to a known RO
+ and have the RO approve the pending request asynchronously. These
+ interactions can be through an interface of the AS itself (such as a
+ hosted web page), through another application (such as something
+ installed on the RO's device), through a messaging fabric, or any
+ other means.
+
+ When interacting with an RO, the AS can use various strategies to
+ determine the authorization of the requested grant, including:
+
+ * authenticate the RO through a local account or some other means,
+ such as federated login
+
+ * validate the RO through presentation of claims, attributes, or
+ other information
+
+ * prompt the RO for consent for the requested delegation
+
+ * describe to the RO what information is being released, to whom,
+ and for what purpose
+
+ * provide warnings to the RO about potential attacks or negative
+ effects of allowing the information
+
+ * allow the RO to modify the client instance's requested access,
+ including limiting or expanding that access
+
+ * provide the RO with artifacts such as receipts to facilitate an
+ audit trail of authorizations
+
+ * allow the RO to deny the requested delegation
+
+ The AS is also allowed to request authorization from more than one
+ RO, if the AS deems fit. For example, a medical record might need to
+ be released by both an attending nurse and a physician, or both
+ owners of a bank account need to sign off on a transfer request.
+ Alternatively, the AS could require N of M possible ROs to approve a
+ given request. In some circumstances, the AS could even determine
+ that the end user present during the interaction is not the
+ appropriate RO for a given request and reach out to the appropriate
+ RO asynchronously.
+
+ The RO is also allowed to define an automated policy at the AS to
+ determine which kind of end user can get access to the resource and
+ under which conditions. For instance, such a condition might require
+ the end user to log in and accept the RO's legal provisions.
+ Alternatively, client software could be acting without an end user,
+ and the RO's policy allows issuance of access tokens to specific
+ instances of that client software without human interaction.
+
+ While all of these cases are supported by GNAP, the details of their
+ implementation and the methods for determining which ROs or related
+ policies are required for a given request are out of scope for this
+ specification.
+
+4.1. Starting Interaction with the End User
+
+ When a grant request is in the _pending_ state, the interaction start
+ methods sent by the client instance can be used to facilitate
+ interaction with the end user. To initiate an interaction start
+ method indicated by the interaction start responses (Section 3.3)
+ from the AS, the client instance follows the steps defined by that
+ interaction start mode. The actions of the client instance required
+ for the interaction start modes defined in this specification are
+ described in the following subsections. Interaction start modes
+ defined in extensions to this specification MUST define the expected
+ actions of the client software when that interaction start mode is
+ used.
+
+ If the client instance does not start an interaction start mode
+ within an AS-determined amount of time, the AS MUST reject attempts
+ to use the interaction start modes. If the client instance has
+ already begun one interaction start mode and the interaction has been
+ successfully completed, the AS MUST reject attempts to use other
+ interaction start modes. For example, if a user code has been
+ successfully entered for a grant request, the AS will need to reject
+ requests to an arbitrary redirect URI on the same grant request in
+ order to prevent an attacker from capturing and altering an active
+ authorization process.
+
+4.1.1. Interaction at a Redirected URI
+
+ When the end user is directed to an arbitrary URI through the
+ "redirect" mode (Section 3.3.1), the client instance facilitates
+ opening the URI through the end user's web browser. The client
+ instance could launch the URI through the system browser, provide a
+ clickable link, redirect the user through HTTP response codes, or
+ display the URI in a form the end user can use to launch, such as a
+ multidimensional barcode. In all cases, the URI is accessed with an
+ HTTP GET request, and the resulting page is assumed to allow direct
+ interaction with the end user through an HTTP user agent. With this
+ method, it is common (though not required) for the RO to be the same
+ party as the end user, since the client instance has to communicate
+ the redirection URI to the end user.
+
+ In many cases, the URI indicates a web page hosted at the AS,
+ allowing the AS to authenticate the end user as the RO and
+ interactively provide consent. The URI value is used to identify the
+ grant request being authorized. If the URI cannot be associated with
+ a currently active request, the AS MUST display an error to the RO
+ and MUST NOT attempt to redirect the RO back to any client instance,
+ even if a redirect finish method is supplied (Section 2.5.2.1). If
+ the URI is not hosted by the AS directly, the means of communication
+ between the AS and the service provided by this URI are out of scope
+ for this specification.
+
+ The client instance MUST NOT modify the URI when launching it; in
+ particular, the client instance MUST NOT add any parameters to the
+ URI. The URI MUST be reachable from the end user's browser, though
+ the URI MAY be opened on a separate device from the client instance
+ itself. The URI MUST be accessible from an HTTP GET request, and it
+ MUST be protected by HTTPS, be hosted on a server local to the RO's
+ browser ("localhost"), or use an application-specific URI scheme that
+ is loaded on the end user's device.
+
+4.1.2. Interaction at the Static User Code URI
+
+ When the end user is directed to enter a short code through the
+ "user_code" mode (Section 3.3.3), the client instance communicates
+ the user code to the end user and directs the end user to enter that
+ code at an associated URI. The client instance MAY format the user
+ code in such a way as to facilitate memorability and transfer of the
+ code, so long as this formatting does not alter the value as accepted
+ at the user code URI. For example, a client instance receiving the
+ user code "A1BC3DFF" could choose to display this to the user as
+ "A1BC 3DFF", breaking up the long string into two shorter strings.
+
+ When processing input codes, the AS MUST transform the input string
+ to remove invalid characters. In the above example, the space in
+ between the two parts would be removed upon its entry into the
+ interactive form at the user code URI. Additionally, the AS MUST
+ treat user input as case insensitive. For example, if the user
+ inputs the string "a1bc 3DFF", the AS will treat the input the same
+ as "A1BC3DFF". To facilitate this, it is RECOMMENDED that the AS use
+ only ASCII letters and numbers as valid characters for the user code.
+
+ It is RECOMMENDED that the AS choose from character values that are
+ easily copied and typed without ambiguity. For example, some glyphs
+ have multiple Unicode code points for the same visual character, and
+ the end user could potentially type a different character than what
+ the AS has returned. For additional considerations of
+ internationalized character strings, see [RFC8264].
+
+ This mode is designed to be used when the client instance is not able
+ to communicate or facilitate launching an arbitrary URI. The
+ associated URI could be statically configured with the client
+ instance or in the client software's documentation. As a
+ consequence, these URIs SHOULD be short. The user code URI MUST be
+ reachable from the end user's browser, though the URI is usually
+ opened on a separate device from the client instance itself. The URI
+ MUST be accessible from an HTTP GET request, and it MUST be protected
+ by HTTPS, be hosted on a server local to the RO's browser
+ ("localhost"), or use an application-specific URI scheme that is
+ loaded on the end user's device.
+
+ In many cases, the URI indicates a web page hosted at the AS,
+ allowing the AS to authenticate the end user as the RO and
+ interactively provide consent. The value of the user code is used to
+ identify the grant request being authorized. If the user code cannot
+ be associated with a currently active request, the AS MUST display an
+ error to the RO and MUST NOT attempt to redirect the RO back to any
+ client instance, even if a redirect finish method is supplied
+ (Section 2.5.2.1). If the interaction component at the user code URI
+ is not hosted by the AS directly, the means of communication between
+ the AS and this URI, including communication of the user code itself,
+ are out of scope for this specification.
+
+ When the RO enters this code at the user code URI, the AS MUST
+ uniquely identify the pending request that the code was associated
+ with. If the AS does not recognize the entered code, the interaction
+ component MUST display an error to the user. If the AS detects too
+ many unrecognized code enter attempts, the interaction component
+ SHOULD display an error to the user indicating too many attempts and
+ MAY take additional actions such as slowing down the input
+ interactions. The user should be warned as such an error state is
+ approached, if possible.
+
+4.1.3. Interaction at a Dynamic User Code URI
+
+ When the end user is directed to enter a short code through the
+ "user_code_uri" mode (Section 3.3.4), the client instance
+ communicates the user code and associated URI to the end user and
+ directs the end user to enter that code at the URI. The client
+ instance MAY format the user code in such a way as to facilitate
+ memorability and transfer of the code, so long as this formatting
+ does not alter the value as accepted at the user code URI. For
+ example, a client instance receiving the user code "A1BC3DFF" could
+ choose to display this to the user as "A1BC 3DFF", breaking up the
+ long string into two shorter strings.
+
+ When processing input codes, the AS MUST transform the input string
+ to remove invalid characters. In the above example, the space in
+ between the two parts would be removed upon its entry into the
+ interactive form at the user code URI. Additionally, the AS MUST
+ treat user input as case insensitive. For example, if the user
+ inputs the string "a1bc 3DFF", the AS will treat the input the same
+ as "A1BC3DFF". To facilitate this, it is RECOMMENDED that the AS use
+ only ASCII letters and numbers as valid characters for the user code.
+
+ This mode is used when the client instance is not able to facilitate
+ launching a complex arbitrary URI but can communicate arbitrary
+ values like URIs. As a consequence, these URIs SHOULD be short
+ enough to allow the URI to be typed by the end user, such as a total
+ length of 20 characters or fewer. The client instance MUST NOT
+ modify the URI when communicating it to the end user; in particular
+ the client instance MUST NOT add any parameters to the URI. The user
+ code URI MUST be reachable from the end user's browser, though the
+ URI is usually be opened on a separate device from the client
+ instance itself. The URI MUST be accessible from an HTTP GET
+ request, and it MUST be protected by HTTPS, be hosted on a server
+ local to the RO's browser ("localhost"), or use an application-
+ specific URI scheme that is loaded on the end user's device.
+
+ In many cases, the URI indicates a web page hosted at the AS,
+ allowing the AS to authenticate the end user as the RO and
+ interactively provide consent. The value of the user code is used to
+ identify the grant request being authorized. If the user code cannot
+ be associated with a currently active request, the AS MUST display an
+ error to the RO and MUST NOT attempt to redirect the RO back to any
+ client instance, even if a redirect finish method is supplied
+ (Section 2.5.2.1). If the interaction component at the user code URI
+ is not hosted by the AS directly, the means of communication between
+ the AS and this URI, including communication of the user code itself,
+ are out of scope for this specification.
+
+ When the RO enters this code at the given URI, the AS MUST uniquely
+ identify the pending request that the code was associated with. If
+ the AS does not recognize the entered code, the interaction component
+ MUST display an error to the user. If the AS detects too many
+ unrecognized code enter attempts, the interaction component SHOULD
+ display an error to the user indicating too many attempts and MAY
+ take additional actions such as slowing down the input interactions.
+ The user should be warned as such an error state is approached, if
+ possible.
+
+4.1.4. Interaction through an Application URI
+
+ When the client instance is directed to launch an application through
+ the "app" mode (Section 3.3.2), the client launches the URI as
+ appropriate to the system, such as through a deep link or custom URI
+ scheme registered to a mobile application. The means by which the AS
+ and the launched application communicate with each other and perform
+ any of the required actions are out of scope for this specification.
+
+4.2. Post-Interaction Completion
+
+ If an interaction "finish" method (Section 3.3.5) is associated with
+ the current request, the AS MUST follow the appropriate method upon
+ completion of interaction in order to signal the client instance to
+ continue, except for some limited error cases discussed below. If a
+ finish method is not available, the AS SHOULD instruct the RO to
+ return to the client instance upon completion. In such cases, it is
+ expected that the client instance will poll the continuation endpoint
+ as described in Section 5.2.
+
+ The AS MUST create an interaction reference and associate that
+ reference with the current interaction and the underlying pending
+ request. The interaction reference value is an ASCII string
+ consisting of only unreserved characters per Section 2.3 of
+ [RFC3986]. The interaction reference value MUST be sufficiently
+ random so as not to be guessable by an attacker. The interaction
+ reference MUST be one-time-use to prevent interception and replay
+ attacks.
+
+ The AS MUST calculate a hash value based on the client instance, AS
+ nonces, and the interaction reference, as described in Section 4.2.3.
+ The client instance will use this value to validate the "finish"
+ call.
+
+ All interaction finish methods MUST define a way to convey the hash
+ and interaction reference back to the client instance. When an
+ interaction finish method is used, the client instance MUST present
+ the interaction reference back to the AS as part of its continuation
+ request (Section 5.1).
+
+ Note that in many error cases, such as when the RO has denied access,
+ the "finish" method is still enacted by the AS. This pattern allows
+ the client instance to potentially recover from the error state by
+ modifying its request or providing additional information directly to
+ the AS in a continuation request. The AS MUST NOT follow the
+ "finish" method in the following circumstances:
+
+ * The AS has determined that any URIs involved with the finish
+ method are dangerous or blocked.
+
+ * The AS cannot determine which ongoing grant request is being
+ referenced.
+
+ * The ongoing grant request has been canceled or otherwise blocked.
+
+4.2.1. Completing Interaction with a Browser Redirect to the Callback
+ URI
+
+ When using the redirect interaction finish method defined in Sections
+ 2.5.2.1 and 3.3.5, the AS signals to the client instance that
+ interaction is complete and the request can be continued by directing
+ the RO (in their browser) back to the client instance's redirect URI.
+
+ The AS secures this redirect by adding the hash and interaction
+ reference as query parameters to the client instance's redirect URI.
+
+ hash: The interaction hash value as described in Section 4.2.3.
+ REQUIRED.
+
+ interact_ref: The interaction reference generated for this
+ interaction. REQUIRED.
+
+ The means of directing the RO to this URI are outside the scope of
+ this specification, but common options include redirecting the RO
+ from a web page and launching the system browser with the target URI.
+ See Section 11.19 for considerations on which HTTP status code to use
+ when redirecting a request that potentially contains credentials.
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ https://client.example.net/return/123455\
+ ?hash=x-gguKWTj8rQf7d7i3w3UhzvuJ5bpOlKyAlVpLxBffY\
+ &interact_ref=4IFWWIKYBC2PQ6U56NL1
+
+ The client instance MUST be able to process a request on the URI. If
+ the URI is HTTP, the request MUST be an HTTP GET.
+
+ When receiving the request, the client instance MUST parse the query
+ parameters to extract the hash and interaction reference values. The
+ client instance MUST calculate and validate the hash value as
+ described in Section 4.2.3. If the hash validates, the client
+ instance sends a continuation request to the AS as described in
+ Section 5.1, using the interaction reference value received here. If
+ the hash does not validate, the client instance MUST NOT send the
+ interaction reference to the AS.
+
+4.2.2. Completing Interaction with a Direct HTTP Request Callback
+
+ When using the push interaction finish method defined in Sections
+ 2.5.2.1 and 3.3.5, the AS signals to the client instance that
+ interaction is complete and the request can be continued by sending
+ an HTTP POST request to the client instance's callback URI.
+
+ The HTTP message content is a JSON object consisting of the following
+ two fields:
+
+ hash (string): The interaction hash value as described in
+ Section 4.2.3. REQUIRED.
+
+ interact_ref (string): The interaction reference generated for this
+ interaction. REQUIRED.
+
+ POST /push/554321 HTTP/1.1
+ Host: client.example.net
+ Content-Type: application/json
+
+ {
+ "hash": "pjdHcrti02HLCwGU3qhUZ3wZXt8IjrV_BtE3oUyOuKNk",
+ "interact_ref": "4IFWWIKYBC2PQ6U56NL1"
+ }
+
+ Since the AS is making an outbound connection to a URI supplied by an
+ outside party (the client instance), the AS MUST protect itself
+ against Server-Side Request Forgery (SSRF) attacks when making this
+ call, as discussed in Section 11.34.
+
+ When receiving the request, the client instance MUST parse the JSON
+ object and validate the hash value as described in Section 4.2.3. If
+ either fails, the client instance MUST return an unknown_interaction
+ error (Section 3.6). If the hash validates, the client instance
+ sends a continuation request to the AS as described in Section 5.1,
+ using the interaction reference value received here.
+
+4.2.3. Calculating the Interaction Hash
+
+ The "hash" parameter in the request to the client instance's callback
+ URI ties the front-channel response to an ongoing request by using
+ values known only to the parties involved. This security mechanism
+ allows the client instance to protect itself against several kinds of
+ session fixation and injection attacks as discussed in Section 11.25.
+ The AS MUST always provide this hash, and the client instance MUST
+ validate the hash when received.
+
+ To calculate the "hash" value, the party doing the calculation
+ creates a hash base string by concatenating the following values in
+ the following order using a single newline (0x0A) character to
+ separate them:
+
+ * the "nonce" value sent by the client instance in the interaction
+ finish field of the initial request (Section 2.5.2)
+
+ * the AS's nonce value from the interaction finish response
+ (Section 3.3.5)
+
+ * the "interact_ref" returned from the AS as part of the interaction
+ finish method (Section 4.2)
+
+ * the grant endpoint URI the client instance used to make its
+ initial request (Section 2)
+
+ There is no padding or whitespace before or after any of the lines
+ and no trailing newline character. The following non-normative
+ example shows a constructed hash base string consisting of these four
+ elements.
+
+ VJLO6A4CATR0KRO
+ MBDOFXG4Y5CVJCX821LH
+ 4IFWWIKYB2PQ6U56NL1
+ https://server.example.com/tx
+
+ The party then hashes the bytes of the ASCII encoding of this string
+ with the appropriate algorithm based on the "hash_method" parameter
+ under the "finish" key of the interaction finish request
+ (Section 2.5.2). The resulting byte array from the hash function is
+ then encoded using URL-Safe base64 with no padding [RFC4648]. The
+ resulting string is the hash value.
+
+ If provided, the "hash_method" value MUST be one of the hash name
+ strings defined in the IANA "Named Information Hash Algorithm
+ Registry" [HASH-ALG]. If the "hash_method" value is not present in
+ the client instance's request, the algorithm defaults to "sha-256".
+
+ For example, the "sha-256" hash method consists of hashing the input
+ string with the 256-bit SHA2 algorithm. The following is the encoded
+ "sha-256" hash of the hash base string in the example above.
+
+ x-gguKWTj8rQf7d7i3w3UhzvuJ5bpOlKyAlVpLxBffY
+
+ As another example, the "sha3-512" hash method consists of hashing
+ the input string with the 512-bit SHA3 algorithm. The following is
+ the encoded "sha3-512" hash of the hash base string in the example
+ above.
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ pyUkVJSmpqSJMaDYsk5G8WCvgY91l-agUPe1wgn-cc5rUtN69gPI2-S_s-Eswed8iB4\
+ PJ_a5Hg6DNi7qGgKwSQ
+
+5. Continuing a Grant Request
+
+ While it is possible for the AS to return an approved grant response
+ (Section 3) with all the client instance's requested information
+ (including access tokens (Section 3.2) and subject information
+ (Section 3.4)) immediately, it's more common that the AS will place
+ the grant request into the _pending_ state and require communication
+ with the client instance several times over the lifetime of a grant
+ request. This is often part of facilitating interaction (Section 4),
+ but it could also be used to allow the AS and client instance to
+ continue negotiating the parameters of the original grant request
+ (Section 2) through modification of the request.
+
+ The ability to continue an already-started request allows the client
+ instance to perform several important functions, including presenting
+ additional information from interaction, modifying the initial
+ request, and revoking a grant request in progress.
+
+ To enable this ongoing negotiation, the AS provides a continuation
+ API to the client software. The AS returns a continue field in the
+ response (Section 3.1) that contains information the client instance
+ needs to access this API, including a URI to access as well as a
+ special access token to use during the requests, called the
+ "continuation access token".
+
+ All requests to the continuation API are protected by a bound
+ continuation access token. The continuation access token is bound to
+ the same key and method the client instance used to make the initial
+ request (or its most recent rotation). As a consequence, when the
+ client instance makes any calls to the continuation URI, the client
+ instance MUST present the continuation access token as described in
+ Section 7.2 and present proof of the client instance's key (or its
+ most recent rotation) by signing the request as described in
+ Section 7.3. The AS MUST validate the signature and ensure that it
+ is bound to the appropriate key for the continuation access token.
+
+ Access tokens other than the continuation access tokens MUST NOT be
+ usable for continuation requests. Conversely, continuation access
+ tokens MUST NOT be usable to make authorized requests to RSs, even if
+ co-located within the AS.
+
+ In the following non-normative example, the client instance makes a
+ POST request to a unique URI and signs the request with HTTP message
+ signatures:
+
+ POST /continue/KSKUOMUKM HTTP/1.1
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Host: server.example.com
+ Content-Length: 0
+ Signature-Input: sig1=...
+ Signature: sig1=...
+
+ The AS MUST be able to tell from the client instance's request which
+ specific ongoing request is being accessed, using a combination of
+ the continuation URI and the continuation access token. If the AS
+ cannot determine a single active grant request to map the
+ continuation request to, the AS MUST return an invalid_continuation
+ error (Section 3.6).
+
+ In the following non-normative example, the client instance makes a
+ POST request to a stable continuation endpoint URI with the
+ interaction reference (Section 5.1), includes the access token, and
+ signs with HTTP message signatures:
+
+ POST /continue HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "interact_ref": "4IFWWIKYBC2PQ6U56NL1"
+ }
+
+ In the following non-normative alternative example, the client
+ instance had been provided a continuation URI unique to this ongoing
+ grant request:
+
+ POST /tx/rxgIIEVMBV-BQUO7kxbsp HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Authorization: GNAP eyJhbGciOiJub25lIiwidHlwIjoiYmFkIn0
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "interact_ref": "4IFWWIKYBC2PQ6U56NL1"
+ }
+
+ In both cases, the AS determines which grant is being asked for based
+ on the URI and continuation access token provided.
+
+ If a wait parameter was included in the continuation response
+ (Section 3.1), the client instance MUST NOT call the continuation URI
+ prior to waiting the number of seconds indicated. If no wait period
+ is indicated, the client instance MUST NOT poll immediately and
+ SHOULD wait at least 5 seconds. If the client instance does not
+ respect the given wait period, the AS MUST return the too_fast error
+ (Section 3.6).
+
+ The response from the AS is a JSON object of a grant response and MAY
+ contain any of the fields described in Section 3, as described in
+ more detail in the subsections below.
+
+ If the AS determines that the client instance can make further
+ requests to the continuation API, the AS MUST include a new
+ continuation response (Section 3.1). The new continuation response
+ MUST include a continuation access token as well, and this token
+ SHOULD be a new access token, invalidating the previous access token.
+ If the AS does not return a new continuation response, the client
+ instance MUST NOT make an additional continuation request. If a
+ client instance does so, the AS MUST return an invalid_continuation
+ error (Section 3.6).
+
+ For continuation functions that require the client instance to send
+ message content, the content MUST be a JSON object.
+
+ For all requests to the grant continuation API, the AS MAY make use
+ of long polling mechanisms such as those discussed in [RFC6202].
+ That is to say, instead of returning the current status immediately,
+ the long polling technique allows the AS additional time to process
+ and fulfill the request before returning the HTTP response to the
+ client instance. For example, when the AS receives a continuation
+ request but the grant request is in the _processing_ state, the AS
+ could wait until the grant request has moved to the _pending_ or
+ _approved_ state before returning the response message.
+
+5.1. Continuing after a Completed Interaction
+
+ When the AS responds to the client instance's finish method as in
+ Section 4.2.1, this response includes an interaction reference. The
+ client instance MUST include that value as the field interact_ref in
+ a POST request to the continuation URI.
+
+ POST /continue HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "interact_ref": "4IFWWIKYBC2PQ6U56NL1"
+ }
+
+ Since the interaction reference is a one-time-use value as described
+ in Section 4.2.1, if the client instance needs to make additional
+ continuation calls after this request, the client instance MUST NOT
+ include the interaction reference in subsequent calls. If the AS
+ detects a client instance submitting an interaction reference when
+ the request is not in the _pending_ state, the AS MUST return a
+ too_many_attempts error (Section 3.6) and SHOULD invalidate the
+ ongoing request by moving it to the _finalized_ state.
+
+ If the grant request is in the _approved_ state, the grant response
+ (Section 3) MAY contain any newly created access tokens (Section 3.2)
+ or newly released subject information (Section 3.4). The response
+ MAY contain a new continuation response (Section 3.1) as described
+ above. The response SHOULD NOT contain any interaction responses
+ (Section 3.3).
+
+ If the grant request is in the _pending_ state, the grant response
+ (Section 3) MUST NOT contain access tokens or subject information and
+ MAY contain a new interaction response (Section 3.3) to any
+ interaction methods that have not been exhausted at the AS.
+
+ For example, if the request is successful in causing the AS to issue
+ access tokens and release opaque subject claims, the response could
+ look like this:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ {
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "manage": {
+ "uri": "https://server.example.com/token/PRY5NM33O",
+ "access_token": {
+ "value": "B8CDFONP21-4TB8N6.BW7ONM"
+ }
+ }
+ },
+ "subject": {
+ "sub_ids": [ {
+ "format": "opaque",
+ "id": "J2G8G8O4AZ"
+ } ]
+ }
+ }
+
+ With the above example, the client instance cannot make an additional
+ continuation request because a continue field is not included.
+
+ In the following non-normative example, the RO has denied the client
+ instance's request, and the AS responds with the following response:
+
+ {
+ "error": "user_denied",
+ "continue": {
+ "access_token": {
+ "value": "33OMUKMKSKU80UPRY5NM"
+ },
+ "uri": "https://server.example.com/continue",
+ "wait": 30
+ }
+ }
+
+ In the preceding example, the AS includes the continue field in the
+ response. Therefore, the client instance can continue the grant
+ negotiation process, perhaps modifying the request as discussed in
+ Section 5.3.
+
+5.2. Continuing during Pending Interaction (Polling)
+
+ When the client instance does not include a finish parameter, the
+ client instance will often need to poll the AS until the RO has
+ authorized the request. To do so, the client instance makes a POST
+ request to the continuation URI as in Section 5.1 but does not
+ include message content.
+
+ POST /continue HTTP/1.1
+ Host: server.example.com
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Signature-Input: sig1=...
+ Signature: sig1=...
+
+ If the grant request is in the _approved_ state, the grant response
+ (Section 3) MAY contain any newly created access tokens (Section 3.2)
+ or newly released subject claims (Section 3.4). The response MAY
+ contain a new continuation response (Section 3.1) as described above.
+ If a continue field is included, it SHOULD include a wait field to
+ facilitate a reasonable polling rate by the client instance. The
+ response SHOULD NOT contain interaction responses (Section 3.3).
+
+ If the grant request is in the _pending_ state, the grant response
+ (Section 3) MUST NOT contain access tokens or subject information and
+ MAY contain a new interaction response (Section 3.3) to any
+ interaction methods that have not been exhausted at the AS.
+
+ For example, if the request has not yet been authorized by the RO,
+ the AS could respond by telling the client instance to make another
+ continuation request in the future. In the following non-normative
+ example, a new, unique access token has been issued for the call,
+ which the client instance will use in its next continuation request.
+
+ {
+ "continue": {
+ "access_token": {
+ "value": "33OMUKMKSKU80UPRY5NM"
+ },
+ "uri": "https://server.example.com/continue",
+ "wait": 30
+ }
+ }
+
+ If the request is successful in causing the AS to issue access tokens
+ and release subject information, the response could look like the
+ following non-normative example:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ {
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "manage": {
+ "uri": "https://server.example.com/token/PRY5NM33O",
+ "access_token": {
+ "value": "B8CDFONP21-4TB8N6.BW7ONM"
+ }
+ }
+ },
+ "subject": {
+ "sub_ids": [ {
+ "format": "opaque",
+ "id": "J2G8G8O4AZ"
+ } ]
+ }
+ }
+
+ See Section 11.23 for considerations on polling for continuation
+ without an interaction finish method.
+
+ In error conditions, the AS responds to the client instance with an
+ error code as discussed in Section 3.6. For example, if the client
+ instance has polled too many times before the RO has approved the
+ request, the AS would respond with a message like the following:
+
+ {
+ "error": "too_many_attempts"
+ }
+
+ Since this response does not include a continue field, the client
+ instance cannot continue to poll the AS for additional updates and
+ the grant request is _finalized_. If the client instance still needs
+ access to the resource, it will need to start with a new grant
+ request.
+
+5.3. Modifying an Existing Request
+
+ The client instance might need to modify an ongoing request, whether
+ or not tokens have already been issued or subject information has
+ already been released. In such cases, the client instance makes an
+ HTTP PATCH request to the continuation URI and includes any fields it
+ needs to modify. Fields that aren't included in the request are
+ considered unchanged from the original request.
+
+ A grant request associated with a modification request MUST be in the
+ _approved_ or _pending_ state. When the AS receives a valid
+ modification request, the AS MUST place the grant request into the
+ _processing_ state and re-evaluate the authorization in the new
+ context created by the update request, since the extent and context
+ of the request could have changed.
+
+ The client instance MAY include the access_token and subject fields
+ as described in Sections 2.1 and 2.2. Inclusion of these fields
+ override any values in the initial request, which MAY trigger
+ additional requirements and policies by the AS. For example, if the
+ client instance is asking for more access, the AS could require
+ additional interaction with the RO to gather additional consent. If
+ the client instance is asking for more limited access, the AS could
+ determine that sufficient authorization has been granted to the
+ client instance and return the more limited access rights
+ immediately. If the grant request was previously in the _approved_
+ state, the AS could decide to remember the larger scale of access
+ rights associated with the grant request, allowing the client
+ instance to make subsequent requests of different subsets of granted
+ access. The details of this processing are out of scope for this
+ specification, but a one possible approach is as follows:
+
+ 1. A client instance requests access to Foo, and this is granted by
+ the RO. This results in an access token: AT1.
+
+ 2. The client instance later modifies the grant request to include
+ Foo and Bar together. Since the client instance was previously
+ granted Foo under this grant request, the RO is prompted to allow
+ the client instance access to Foo and Bar together. This results
+ in a new access token: AT2. This access token has access to both
+ Foo and Bar. The rights of the original access token AT1 are not
+ modified.
+
+ 3. The client instance makes another grant modification to ask only
+ for Bar. Since the client instance was previously granted Foo and
+ Bar together under this grant request, the RO is not prompted,
+ and the access to Bar is granted in a new access token: AT3.
+ This new access token does not allow access to Foo.
+
+ 4. The original access token AT1 expires, and the client seeks a new
+ access token to replace it. The client instance makes another
+ grant modification to ask only for Foo. Since the client instance
+ was previously granted Foo and Bar together under this grant
+ request, the RO is not prompted, and the access to Foo is granted
+ in a new access token: AT4. This new access token does not allow
+ access to Bar.
+
+ All four access tokens are independent of each other and associated
+ with the same underlying grant request. Each of these access tokens
+ could possibly also be rotated using token management, if available.
+ For example, instead of asking for a new token to replace AT1, the
+ client instance could ask for a refresh of AT1 using the rotation
+ method of the token management API. This would result in a refreshed
+ AT1 with a different token value and expiration from the original AT1
+ but with the same access rights of allowing only access to Foo.
+
+ The client instance MAY include the interact field as described in
+ Section 2.5. Inclusion of this field indicates that the client
+ instance is capable of driving interaction with the end user, and
+ this field replaces any values from a previous request. The AS MAY
+ respond to any of the interaction responses as described in
+ Section 3.3, just like it would to a new request.
+
+ The client instance MAY include the user field as described in
+ Section 2.4 to present new assertions or information about the end
+ user. The AS SHOULD check that this presented user information is
+ consistent with any user information previously presented by the
+ client instance or otherwise associated with this grant request.
+
+ The client instance MUST NOT include the client field of the request,
+ since the client instance is assumed not to have changed.
+ Modification of client instance information, including rotation of
+ keys associated with the client instance, is outside the scope of
+ this specification.
+
+ The client instance MUST NOT include post-interaction responses such
+ as those described in Section 5.1.
+
+ Modification requests MUST NOT alter previously issued access tokens.
+ Instead, any access tokens issued from a continuation are considered
+ new, separate access tokens. The AS MAY revoke previously issued
+ access tokens after a modification has occurred.
+
+ If the modified request can be granted immediately by the AS (the
+ grant request is in the _approved_ state), the grant response
+ (Section 3) MAY contain any newly created access tokens (Section 3.2)
+ or newly released subject claims (Section 3.4). The response MAY
+ contain a new continuation response (Section 3.1) as described above.
+ If interaction can occur, the response SHOULD contain interaction
+ responses (Section 3.3) as well.
+
+ For example, a client instance initially requests a set of resources
+ using references:
+
+ POST /tx HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "access_token": {
+ "access": [
+ "read", "write"
+ ]
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.example.net/return/123455",
+ "nonce": "LKLTI25DK82FX4T4QFZC"
+ }
+ },
+ "client": "987YHGRT56789IOLK"
+ }
+
+ Access is granted by the RO, and a token is issued by the AS. In its
+ final response, the AS includes a continue field, which includes a
+ separate access token for accessing the continuation API:
+
+ {
+ "continue": {
+ "access_token": {
+ "value": "80UPRY5NM33OMUKMKSKU"
+ },
+ "uri": "https://server.example.com/continue",
+ "wait": 30
+ },
+ "access_token": {
+ "value": "RP1LT0-OS9M2P_R64TB",
+ "access": [
+ "read", "write"
+ ]
+ }
+ }
+
+ This continue field allows the client instance to make an eventual
+ continuation call. Some time later, the client instance realizes
+ that it no longer needs "write" access and therefore modifies its
+ ongoing request, here asking for just "read" access instead of both
+ "read" and "write" as before.
+
+ PATCH /continue HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "access_token": {
+ "access": [
+ "read"
+ ]
+ }
+ ...
+ }
+
+ The AS replaces the previous access from the first request, allowing
+ the AS to determine if any previously granted consent already
+ applies. In this case, the AS would determine that reducing the
+ breadth of the requested access means that new access tokens can be
+ issued to the client instance without additional interaction or
+ consent. The AS would likely revoke previously issued access tokens
+ that had the greater access rights associated with them, unless they
+ had been issued with the durable flag.
+
+ {
+ "continue": {
+ "access_token": {
+ "value": "M33OMUK80UPRY5NMKSKU"
+ },
+ "uri": "https://server.example.com/continue",
+ "wait": 30
+ },
+ "access_token": {
+ "value": "0EVKC7-2ZKwZM_6N760",
+ "access": [
+ "read"
+ ]
+ }
+ }
+
+ As another example, the client instance initially requests read-only
+ access but later needs to step up its access. The initial request
+ could look like the following HTTP message:
+
+ POST /tx HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "access_token": {
+ "access": [
+ "read"
+ ]
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.example.net/return/123455",
+ "nonce": "LKLTI25DK82FX4T4QFZC"
+ }
+ },
+ "client": "987YHGRT56789IOLK"
+ }
+
+ Access is granted by the RO, and a token is issued by the AS. In its
+ final response, the AS includes a continue field:
+
+ {
+ "continue": {
+ "access_token": {
+ "value": "80UPRY5NM33OMUKMKSKU"
+ },
+ "uri": "https://server.example.com/continue",
+ "wait": 30
+ },
+ "access_token": {
+ "value": "RP1LT0-OS9M2P_R64TB",
+ "access": [
+ "read"
+ ]
+ }
+ }
+
+ This allows the client instance to make an eventual continuation
+ call. The client instance later realizes that it now needs "write"
+ access in addition to the "read" access. Since this is an expansion
+ of what it asked for previously, the client instance also includes a
+ new interaction field in case the AS needs to interact with the RO
+ again to gather additional authorization. Note that the client
+ instance's nonce and callback are different from the initial request.
+ Since the original callback was already used in the initial exchange
+ and the callback is intended for one-time use, a new one needs to be
+ included in order to use the callback again.
+
+ PATCH /continue HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "access_token": {
+ "access": [
+ "read", "write"
+ ]
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.example.net/return/654321",
+ "nonce": "K82FX4T4LKLTI25DQFZC"
+ }
+ }
+ }
+
+ From here, the AS can determine that the client instance is asking
+ for more than it was previously granted, but since the client
+ instance has also provided a mechanism to interact with the RO, the
+ AS can use that to gather the additional consent. The protocol
+ continues as it would with a new request. Since the old access
+ tokens are good for a subset of the rights requested here, the AS
+ might decide to not revoke them. However, any access tokens granted
+ after this update process are new access tokens and do not modify the
+ rights of existing access tokens.
+
+5.4. Revoking a Grant Request
+
+ If the client instance wishes to cancel an ongoing grant request and
+ place it into the _finalized_ state, the client instance makes an
+ HTTP DELETE request to the continuation URI.
+
+ DELETE /continue HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Signature-Input: sig1=...
+ Signature: sig1=...
+
+ If the request is successfully revoked, the AS responds with HTTP
+ status code 204 (No Content). The AS SHOULD revoke all associated
+ access tokens, if possible. The AS SHOULD disable all token rotation
+ and other token management functions on such access tokens, if
+ possible. Once the grant request is in the _finalized_ state, it
+ MUST NOT be moved to any other state.
+
+ If the request is not revoked, the AS responds with an
+ invalid_continuation error (Section 3.6).
+
+6. Token Management
+
+ If an access token response includes the manage field as described in
+ Section 3.2.1, the client instance MAY call this URI to manage the
+ access token with the rotate and revoke actions defined in the
+ following subsections. Other actions are undefined by this
+ specification.
+
+ {
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "flags": ["bearer"],
+ "manage": {
+ "uri": "https://server.example.com/token/PRY5NM33O",
+ "access_token": {
+ "value": "B8CDFONP21-4TB8N6.BW7ONM"
+ }
+ }
+ }
+ }
+
+ The token management access token issued under the manage field is
+ used to protect all calls to the token management API. The client
+ instance MUST present proof of the key associated with the token
+ along with the value of the token management access token.
+
+ The AS MUST validate the proof and ensure that it is associated with
+ the token management access token.
+
+ The AS MUST uniquely identify the token being managed from the token
+ management URI, the token management access token, or a combination
+ of both.
+
+6.1. Rotating the Access Token Value
+
+ If the client instance has an access token and that access token
+ expires, the client instance might want to rotate the access token to
+ a new value without expiration. Rotating an access token consists of
+ issuing a new access token in place of an existing access token, with
+ the same rights and properties as the original token, apart from an
+ updated token value and expiration time.
+
+ To rotate an access token, the client instance makes an HTTP POST to
+ the token management URI with no message content, sending the access
+ token in the authorization header as described in Section 7.2 and
+ signing the request with the appropriate key.
+
+ POST /token/PRY5NM33O HTTP/1.1
+ Host: server.example.com
+ Authorization: GNAP B8CDFONP21-4TB8N6.BW7ONM
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ The client instance cannot request to alter the access rights
+ associated with the access token during a rotation request. To get
+ an access token with different access rights for this grant request,
+ the client instance has to call the continuation API's update
+ functionality (Section 5.3) to get a new access token. The client
+ instance can also create a new grant request with the required access
+ rights.
+
+ The AS validates that the token management access token presented is
+ associated with the management URI, that the AS issued the token to
+ the given client instance, and that the presented key is the correct
+ key for the token management access token. The AS determines which
+ access token is being rotated from the token management URI, the
+ token management access token, or both.
+
+ If the token is validated and the key is appropriate for the request,
+ the AS MUST invalidate the current access token value associated with
+ this URI, if possible. Note that stateless access tokens can make
+ proactive revocation difficult within a system; see Section 11.32.
+
+ For successful rotations, the AS responds with an HTTP status code
+ 200 (OK) with JSON-formatted message content consisting of the
+ rotated access token in the access_token field described in
+ Section 3.2.1. The value of the access token MUST NOT be the same as
+ the current value of the access token used to access the management
+ API. The response MUST include an access token management URI, and
+ the value of this URI MAY be different from the URI used by the
+ client instance to make the rotation call. The client instance MUST
+ use this new URI to manage the rotated access token.
+
+ The access rights in the access array for the rotated access token
+ MUST be included in the response and MUST be the same as the token
+ before rotation.
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ {
+ "access_token": {
+ "value": "FP6A8H6HY37MH13CK76LBZ6Y1UADG6VEUPEER5H2",
+ "manage": {
+ "uri": "https://server.example.com/token/PRY5NM33O",
+ "access_token": {
+ "value": "B8CDFONP21-4TB8N6.BW7ONM"
+ }
+ },
+ "expires_in": 3600,
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [
+ "read",
+ "write",
+ "dolphin"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ]
+ },
+ "read", "dolphin-metadata"
+ ]
+ }
+ }
+
+ If the AS is unable or unwilling to rotate the value of the access
+ token, the AS responds with an invalid_rotation error (Section 3.6).
+ Upon receiving such an error, the client instance MUST consider the
+ access token to not have changed its state.
+
+6.1.1. Binding a New Key to the Rotated Access Token
+
+ If the client instance wishes to bind a new presentation key to an
+ access token, the client instance MUST present both the new key and
+ the proof of previous key material in the access token rotation
+ request. The client instance makes an HTTP POST as a JSON object
+ with the following field:
+
+ key: The new key value or reference in the format described in
+ Section 7.1. Note that keys passed by value are always public
+ keys. REQUIRED when doing key rotation.
+
+ The proofing method and parameters for the new key MUST be the same
+ as those established for the previous key.
+
+ The client instance MUST prove possession of both the currently bound
+ key and the newly requested key simultaneously in the rotation
+ request. Specifically, the signature from the previous key MUST
+ cover the value or reference of the new key, and the signature of the
+ new key MUST cover the signature value of the old key. The means of
+ doing so vary depending on the proofing method in use. For example,
+ the HTTP message signatures proofing method uses multiple signatures
+ in the request as described in Section 7.3.1.1. This is shown in the
+ following example.
+
+ POST /token/PRY5NM33O HTTP/1.1
+ Host: server.example.com
+ Authorization: GNAP B8CDFONP21-4TB8N6.BW7ONM
+ Signature-Input: \
+ sig1=("@method" "@target-uri" "content-digest" \
+ "authorization"),\
+ sig2=("@method" "@target-uri" "content-digest" \
+ "authorization" "signature";key="sig1" \
+ "signature-input";key="sig1")
+ Signature: sig1=..., sig2=...
+ Content-Digest: sha-256=...
+
+ {
+ "key": {
+ "proof": "httpsig",
+ "jwk": {
+ "kty": "RSA",
+ "e": "AQAB",
+ "kid": "xyz-2",
+ "alg": "RS256",
+ "n": "kOB5rR4Jv0GMeLaY6_It_r3ORwdf8ci_JtffXyaSx8xY..."
+ }
+ }
+ }
+
+ Failure to present the appropriate proof of either the new key or the
+ previous key for the access token, as defined by the proofing method,
+ MUST result in an invalid_rotation error code from the AS
+ (Section 3.6).
+
+ An attempt to change the proofing method or parameters, including an
+ attempt to rotate the key of a bearer token (which has no key), MUST
+ result in an invalid_rotation error code returned from the AS
+ (Section 3.6).
+
+ If the AS does not allow rotation of the access token's key for any
+ reason, including but not limited to lack of permission for this
+ client instance or lack of capability by the AS, the AS MUST return a
+ key_rotation_not_supported error code (Section 3.6).
+
+6.2. Revoking the Access Token
+
+ If the client instance wishes to revoke the access token proactively,
+ such as when a user indicates to the client instance that they no
+ longer wish for it to have access or the client instance application
+ detects that it is being uninstalled, the client instance can use the
+ token management URI to indicate to the AS that the AS SHOULD
+ invalidate the access token for all purposes.
+
+ The client instance makes an HTTP DELETE request to the token
+ management URI, presenting the access token and signing the request
+ with the appropriate key.
+
+ DELETE /token/PRY5NM33O HTTP/1.1
+ Host: server.example.com
+ Authorization: GNAP B8CDFONP21-4TB8N6.BW7ONM
+ Signature-Input: sig1=...
+ Signature: sig1=...
+
+ If the key presented is associated with the token (or the client
+ instance, in the case of a bearer token), the AS MUST invalidate the
+ access token, if possible, and return an HTTP response code 204.
+
+ 204 No Content
+
+ Though the AS MAY revoke an access token at any time for any reason,
+ the token management function is specifically for the client
+ instance's use. If the access token has already expired or has been
+ revoked through other means, the AS SHOULD honor the revocation
+ request to the token management URI as valid, since the end result is
+ that the token is still not usable.
+
+7. Securing Requests from the Client Instance
+
+ In GNAP, the client instance secures its requests to an AS and RS by
+ presenting an access token, proof of a key that it possesses (aka, a
+ "key proof"), or both an access token and key proof together.
+
+ * When an access token is used with a key proof, this is a bound
+ token request. This type of request is used for calls to the RS
+ as well as the AS during grant negotiation.
+
+ * When a key proof is used with no access token, this is a non-
+ authorized signed request. This type of request is used for calls
+ to the AS to initiate a grant negotiation.
+
+ * When an access token is used with no key proof, this is a bearer
+ token request. This type of request is used only for calls to the
+ RS and only with access tokens that are not bound to any key as
+ described in Section 3.2.1.
+
+ * When neither an access token nor key proof are used, this is an
+ unsecured request. This type of request is used optionally for
+ calls to the RS as part of an RS-first discovery process as
+ described in Section 9.1.
+
+7.1. Key Formats
+
+ Several different places in GNAP require the presentation of key
+ material by value or by reference. Key material sent by value is
+ sent using a JSON object with several fields described in this
+ section.
+
+ All keys are associated with a specific key proofing method. The
+ proofing method associated with the key is indicated using the proof
+ field of the key object.
+
+ proof (string or object): The form of proof that the client instance
+ will use when presenting the key. The valid values of this field
+ and the processing requirements for each are detailed in
+ Section 7.3. REQUIRED.
+
+ A key presented by value MUST be a public key and MUST be presented
+ in only one supported format, as discussed in Section 11.35. Note
+ that while most formats present the full value of the public key,
+ some formats present a value cryptographically derived from the
+ public key. See additional discussion of the presentation of public
+ keys in Section 11.7.
+
+ jwk (object): The public key and its properties represented as a
+ JSON Web Key (JWK) [RFC7517]. A JWK MUST contain the alg
+ (Algorithm) and kid (Key ID) parameters. The alg parameter MUST
+ NOT be "none". The x5c (X.509 Certificate Chain) parameter MAY be
+ used to provide the X.509 representation of the provided public
+ key. OPTIONAL.
+
+ cert (string): The Privacy-Enhanced Mail (PEM) serialized value of
+ the certificate used to sign the request, with optional internal
+ whitespace per [RFC7468]. The PEM header and footer are
+ optionally removed. OPTIONAL.
+
+ cert#S256 (string): The certificate thumbprint calculated as per
+ MTLS for OAuth [RFC8705] in base64url encoding. Note that this
+ format does not include the full public key. OPTIONAL.
+
+ Additional key formats can be defined in the "GNAP Key Formats"
+ registry (Section 10.17).
+
+ The following non-normative example shows a single key presented in
+ two different formats. The example key is intended to be used with
+ the HTTP message signatures proofing mechanism (Section 7.3.1), as
+ indicated by the httpsig value of the proof field.
+
+ As a JWK:
+
+ "key": {
+ "proof": "httpsig",
+ "jwk": {
+ "kty": "RSA",
+ "e": "AQAB",
+ "kid": "xyz-1",
+ "alg": "RS256",
+ "n": "kOB5rR4Jv0GMeLaY6_It_r3ORwdf8ci_JtffXyaSx8xY..."
+ }
+ }
+
+ As a certificate in PEM format:
+
+ "key": {
+ "proof": "httpsig",
+ "cert": "MIIEHDCCAwSgAwIBAgIBATANBgkqhkiG9w0BAQsFA..."
+ }
+
+ When the key is presented in GNAP, proof of this key material MUST be
+ used to bind the request, the nature of which varies with the
+ location in the protocol where the key is used. For a key used as
+ part of a client instance's initial request in Section 2.3, the key
+ value represents the client instance's public key, and proof of that
+ key MUST be presented in that request. For a key used as part of an
+ access token response in Section 3.2.1, the proof of that key MUST be
+ used when the client instance later presents the access token to the
+ RS.
+
+7.1.1. Key References
+
+ Keys in GNAP can also be passed by reference such that the party
+ receiving the reference will be able to determine the appropriate
+ keying material for use in that part of the protocol. A key
+ reference is a single opaque string.
+
+ "key": "S-P4XJQ_RYJCRTSU1.63N3E"
+
+ Keys referenced in this manner MAY be shared symmetric keys. See the
+ additional considerations for symmetric keys in Section 11.7. The
+ key reference MUST NOT contain any unencrypted private or shared
+ symmetric key information.
+
+ Keys referenced in this manner MUST be bound to a single proofing
+ mechanism.
+
+ The means of dereferencing this reference to a key value and proofing
+ mechanism are out of scope for this specification. Commonly, key
+ references are created by the AS and do not necessarily need to be
+ understood by the client. These types of key references are an
+ internal reference to the AS, such as an identifier of a record in a
+ database. In other applications, it can be useful to use key
+ references that are resolvable by both clients and the AS, which
+ could be accomplished by a client publishing a public key at a URI,
+ for example. For interoperability, this method could later be
+ described as an extension, but doing so is out of scope for this
+ specification.
+
+7.1.2. Key Protection
+
+ The security of GNAP relies on the cryptographic security of the keys
+ themselves. When symmetric keys are used in GNAP, a key management
+ system or secure key derivation mechanism MUST be used to supply the
+ keys. Symmetric keys MUST NOT be a human-memorable password or a
+ value derived from one. Symmetric keys MUST NOT be passed by value
+ from the client instance to the AS.
+
+ Additional security considerations apply when rotating keys (see
+ Section 11.22).
+
+7.2. Presenting Access Tokens
+
+ Access tokens are issued to client instances in GNAP to allow the
+ client instance to make an authorized call to an API. The method the
+ client instance uses to send an access token depends on whether the
+ token is bound to a key and, if so, which proofing method is
+ associated with the key. This information is conveyed by the key
+ parameter and the bearer flag in the access token response structure
+ (Section 3.2.1).
+
+ If the flags field does not contain the bearer flag and the key is
+ absent, the access token MUST be sent using the same key and proofing
+ mechanism that the client instance used in its initial request (or
+ its most recent rotation).
+
+ If the flags field does not contain the bearer flag and the key value
+ is an object as described in Section 7.1, the access token MUST be
+ sent using the key and proofing mechanism defined by the value of the
+ proof field within the key object.
+
+ The access token MUST be sent using the HTTP Authorization request
+ header field and the "GNAP" authorization scheme along with a key
+ proof as described in Section 7.3 for the key bound to the access
+ token. For example, an access token bound using HTTP message
+ signatures would be sent as follows:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ GET /stuff HTTP/1.1
+ Host: resource.example.com
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Signature-Input: sig1=("@method" "@target-uri" "authorization")\
+ ;created=1618884473;keyid="gnap-rsa";nonce="NAOEJF12ER2";tag="gnap"
+ Signature: sig1=:FQ+EjWqc38uLFByKa5y+c4WyYYwCTGUhidWKfr5L1Cha8FiPEw\
+ DxG7nWttpBLS/B6VLfkZJogPbclySs9MDIsAIJwHnzlcJjwXWR2lfvm2z3X7EkJHm\
+ Zp4SmyKOS34luAiKR1xwf32NYFolHmZf/SbHZJuWvQuS4U33C+BbsXz8MflFH1Dht\
+ H/C1E5i244gSbdLCPxzABc/Q0NHVSLo1qaouYIvnxXB8OT3K7mwWjsLh1GC5vFThb\
+ 3XQ363r6f0OPRa4qWHhubR/d/J/lNOjbBdjq9AJ69oqNJ+A2XT+ZCrVasEJE0OBvD\
+ auQoiywhb8BMB7+PEINsPk5/8UvaNxbw==:
+
+ If the flags field contains the bearer flag, the access token is a
+ bearer token that MUST be sent using the Authorization request header
+ field method defined in [RFC6750].
+
+ Authorization: Bearer OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0
+
+ The Form-Encoded Body Parameter and URI Query Parameter methods of
+ [RFC6750] MUST NOT be used for GNAP access tokens.
+
+7.3. Proving Possession of a Key with a Request
+
+ Any keys presented by the client instance to the AS or RS MUST be
+ validated as part of the request in which they are presented. The
+ type of binding used is indicated by the proof parameter of the key
+ object in Section 7.1. Key proofing methods are specified either by
+ a string, which consists of the key proofing method name on its own,
+ or by a JSON object with the required field method:
+
+ method: The name of the key proofing method to be used. REQUIRED.
+
+ Individual methods defined as objects MAY define additional
+ parameters as members in this object.
+
+ Values for the method defined by this specification are as follows:
+
+ "httpsig" (string or object): HTTP message signing. See
+ Section 7.3.1.
+
+ "mtls" (string): MTLS certificate verification. See Section 7.3.2.
+
+ "jwsd" (string): A detached JWS signature header. See
+ Section 7.3.3.
+
+ "jws" (string): Attached JWS Payload. See Section 7.3.4.
+
+ Additional proofing methods can be defined in the "GNAP Key Proofing
+ Methods" registry (Section 10.16).
+
+ Proofing methods MAY be defined as both an object and a string. For
+ example, the httpsig method can be specified as an object with its
+ parameters explicitly declared, such as:
+
+ {
+ "proof": {
+ "method": "httpsig",
+ "alg": "ecdsa-p384-sha384",
+ "content-digest-alg": "sha-256"
+ }
+ }
+
+ The httpsig method also defines default behavior when it is passed as
+ a string form, using the signature algorithm specified by the
+ associated key material and the content digest is calculated using
+ sha-256. This configuration can be selected using the following
+ shortened form:
+
+ {
+ "proof": "httpsig"
+ }
+
+ All key binding methods used by this specification MUST cover all
+ relevant portions of the request, including anything that would
+ change the nature of the request, to allow for secure validation of
+ the request. Relevant aspects include the URI being called, the HTTP
+ method being used, any relevant HTTP headers and values, and the HTTP
+ message content itself. The verifier of the signed message MUST
+ validate all components of the signed message to ensure that nothing
+ has been tampered with or substituted in a way that would change the
+ nature of the request. Definitions of key binding methods MUST
+ enumerate how these requirements are fulfilled.
+
+ When a key proofing mechanism is bound to an access token, the key
+ being presented MUST be the key associated with the access token, and
+ the access token MUST be covered by the signature method of the
+ proofing mechanism.
+
+ The key binding methods in this section MAY be used by other
+ components making calls as part of GNAP, such as the extensions
+ allowing the RS to make calls to the AS defined in [GNAP-RS]. To
+ facilitate this extended use, "signer" and "verifier" are used as
+ generic terms in the subsections below. In the core functions of
+ GNAP specified in this document, the "signer" is the client instance,
+ and the "verifier" is the AS (for grant requests) or RS (for resource
+ requests), as appropriate.
+
+ When used for delegation in GNAP, these key binding mechanisms allow
+ the AS to ensure that the keys presented by the client instance in
+ the initial request are in control of the party calling any follow-up
+ or continuation requests. To facilitate this requirement, the
+ continuation response (Section 3.1) includes an access token bound to
+ the client instance's key (Section 2.3), and that key (or its most
+ recent rotation) MUST be proved in all continuation requests
+ (Section 5). Token management requests (Section 6) are similarly
+ bound to either the access token's own key or, in the case of bearer
+ tokens, the client instance's key.
+
+ In the following subsections, unless otherwise noted, the RS256 JSON
+ Object Signing and Encryption (JOSE) signature algorithm (defined in
+ Section 3.3 of [RFC7518]) is applied using the following RSA key
+ (presented here in JWK format):
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ {
+ "kid": "gnap-rsa",
+ "p": "xS4-YbQ0SgrsmcA7xDzZKuVNxJe3pCYwdAe6efSy4hdDgF9-vhC5gjaRk\
+ i1wWuERSMW4Tv44l5HNrL-Bbj_nCJxr_HAOaesDiPn2PnywwEfg3Nv95Nn-\
+ eilhqXRaW-tJKEMjDHu_fmJBeemHNZI412gBnXdGzDVo22dvYoxd6GM",
+ "kty": "RSA",
+ "q": "rVdcT_uy-CD0GKVLGpEGRR7k4JO6Tktc8MEHkC6NIFXihk_6vAIOCzCD6\
+ LMovMinOYttpRndKoGTNdJfWlDFDScAs8C5n2y1STCQPRximBY-bw39-aZq\
+ JXMxOLyPjzuVgiTOCBIvLD6-8-mvFjXZk_eefD0at6mQ5qV3U1jZt88",
+ "d": "FHlhdTF0ozTliDxMBffT6aJVKZKmbbFJOVNten9c3lXKB3ux3NAb_D2dB\
+ 7inp9EV23oWrDspFtvCvD9dZrXgRKMHofkEpo_SSvBZfgtH-OTkbY_TqtPF\
+ FLPKAw0JX5cFPnn4Q2xE4n-dQ7tpRCKl59vZLHBrHShr90zqzFp0AKXU5fj\
+ b1gC9LPwsFA2Fd7KXmI1drQQEVq9R-o18Pnn4BGQNQNjO_VkcJTiBmEIVT_\
+ KJRPdpVJAmbgnYWafL_hAfeb_dK8p85yurEVF8nCK5oO3EPrqB7IL4UqaEn\
+ 5Sl3u0j8x5or-xrrAoNz-gdOv7ONfZY6NFoa-3f8q9wBAHUuQ",
+ "e": "AQAB",
+ "qi": "ogpNEkDKg22Rj9cDV_-PJBZaXMk66Fp557RT1tafIuqJRHEufSOYnsto\
+ bWPJ0gHxv1gVJw3gm-zYvV-wTMNgr2wVsBSezSJjPSjxWZtmT2z68W1DuvK\
+ kZy15vz7Jd85hmDlriGcXNCoFEUsGLWkpHH9RwPIzguUHWmTt8y0oXyI",
+ "dp": "dvCKGI2G7RLh3WyjoJ_Dr6hZ3LhXweB3YcY3qdD9BnxZ71mrLiMQg4c_\
+ EBnwqCETN_5sStn2cRc2JXnvLP3G8t7IFKHTT_i_TSTacJ7uT04MSa053Y3\
+ RfwbvLjRNPR0UKAE3ZxROUoIaVNuU_6-QMf8-2ilUv2GIOrCN87gP_Vk",
+ "alg": "RS256",
+ "dq": "iMZmELaKgT9_W_MRT-UfDWtTLeFjIGRW8aFeVmZk9R7Pnyt8rNzyN-IQ\
+ M40ql8u8J6vc2GmQGfokLlPQ6XLSCY68_xkTXrhoU1f-eDntkhP7L6XawSK\
+ Onv5F2H7wyBQ75HUmHTg8AK2B_vRlMyFKjXbVlzKf4kvqChSGEz4IjQ",
+ "n": "hYOJ-XOKISdMMShn_G4W9m20mT0VWtQBsmBBkI2cmRt4Ai8BfYdHsFzAt\
+ YKOjpBR1RpKpJmVKxIGNy0g6Z3ad2XYsh8KowlyVy8IkZ8NMwSrcUIBZGYX\
+ jHpwjzvfGvXH_5KJlnR3_uRUp4Z4Ujk2bCaKegDn11V2vxE41hqaPUnhRZx\
+ e0jRETddzsE3mu1SK8dTCROjwUl14mUNo8iTrTm4n0qDadz8BkPo-uv4BC0\
+ bunS0K3bA_3UgVp7zBlQFoFnLTO2uWp_muLEWGl67gBq9MO3brKXfGhi3kO\
+ zywzwPTuq-cVQDyEN7aL0SxCb3Hc4IdqDaMg8qHUyObpPitDQ"
+ }
+
+ Key proofing methods SHOULD define a mechanism to allow the rotation
+ of keys discussed in Section 6.1.1. Key rotation mechanisms MUST
+ define a way for presenting proof of two keys simultaneously with the
+ following attributes:
+
+ * The value of or reference to the new key material MUST be signed
+ by the existing key. Generally speaking, this amounts to using
+ the existing key to sign the content of the message that contains
+ the new key.
+
+ * The signature of the old key MUST be signed by the new key.
+ Generally speaking, this means including the signature value of
+ the old key under the coverage of the new key.
+
+7.3.1. HTTP Message Signatures
+
+ This method is indicated by the method value httpsig and can be
+ declared in either object form or string form.
+
+ When the proofing method is specified in object form, the following
+ parameters are defined:
+
+ alg: The HTTP signature algorithm, from the "HTTP Signature
+ Algorithms" registry. REQUIRED.
+
+ content-digest-alg: The algorithm used for the Content-Digest field,
+ used to protect the content when present in the message.
+ REQUIRED.
+
+ This example uses the Elliptic Curve Digital Signature Algorithm
+ (ECDSA) signing algorithm over the P384 curve and the SHA-512 hashing
+ algorithm for the content digest.
+
+ {
+ "proof": {
+ "method": "httpsig",
+ "alg": "ecdsa-p384-sha384",
+ "content-digest-alg": "sha-512"
+ }
+ }
+
+ When the proofing method is specified in string form, the signing
+ algorithm MUST be derived from the key material (such as using the
+ JWS algorithm in a JWK formatted key), and the content digest
+ algorithm MUST be sha-256.
+
+ {
+ "proof": "httpsig"
+ }
+
+ When using this method, the signer creates an HTTP message signature
+ as described in [RFC9421]. The covered components of the signature
+ MUST include the following:
+
+ "@method": The method used in the HTTP request.
+
+ "@target-uri": The full request URI of the HTTP request.
+
+ When the message contains request content, the covered components
+ MUST also include the following:
+
+ "content-digest": The Content-Digest header as defined in [RFC9530].
+ When the request message has content, the signer MUST calculate
+ this field value and include the field in the request. The
+ verifier MUST validate this field value. REQUIRED when the
+ message request contains message content.
+
+ When the request is bound to an access token, the covered components
+ MUST also include the following:
+
+ "authorization": The Authorization header used to present the access
+ token as discussed in Section 7.2.
+
+ Other message components MAY also be included.
+
+ The signer MUST include the tag signature parameter with the value
+ gnap, and the verifier MUST verify that the parameter exists with
+ this value. The signer MUST include the created signature parameter
+ with a timestamp of when the signature was created, and the verifier
+ MUST ensure that the creation timestamp is sufficiently close to the
+ current time given expected network delay and clock skew. The signer
+ SHOULD include the nonce parameter with a unique and unguessable
+ value. When included, the verifier MUST determine that the nonce
+ value is unique within a reasonably short time period such as several
+ minutes.
+
+ If the signer's key presented is a JWK, the keyid parameter of the
+ signature MUST be set to the kid value of the JWK, and the signing
+ algorithm used MUST be the JWS algorithm denoted by the key's alg
+ field of the JWK.
+
+ The explicit alg signature parameter MUST NOT be included in the
+ signature, since the algorithm will be derived from either the key
+ material or the proof value.
+
+ In the following non-normative example, the message content is a JSON
+ object:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ {
+ "access_token": {
+ "access": [
+ "dolphin-metadata"
+ ]
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.foo/callback",
+ "nonce": "VJLO6A4CAYLBXHTR0KRO"
+ }
+ },
+ "client": {
+ "key": {
+ "proof": "httpsig",
+ "jwk": {
+ "kid": "gnap-rsa",
+ "kty": "RSA",
+ "e": "AQAB",
+ "alg": "PS512",
+ "n": "hYOJ-XOKISdMMShn_G4W9m20mT0VWtQBsmBBkI2cmRt4Ai8Bf\
+ YdHsFzAtYKOjpBR1RpKpJmVKxIGNy0g6Z3ad2XYsh8KowlyVy8IkZ8NMwSrcUIBZG\
+ YXjHpwjzvfGvXH_5KJlnR3_uRUp4Z4Ujk2bCaKegDn11V2vxE41hqaPUnhRZxe0jR\
+ ETddzsE3mu1SK8dTCROjwUl14mUNo8iTrTm4n0qDadz8BkPo-uv4BC0bunS0K3bA_\
+ 3UgVp7zBlQFoFnLTO2uWp_muLEWGl67gBq9MO3brKXfGhi3kOzywzwPTuq-cVQDyE\
+ N7aL0SxCb3Hc4IdqDaMg8qHUyObpPitDQ"
+ }
+ }
+ "display": {
+ "name": "My Client Display Name",
+ "uri": "https://client.foo/"
+ },
+ }
+ }
+
+ This content is hashed for the Content-Digest header using sha-256
+ into the following encoded value:
+
+ sha-256=:q2XBmzRDCREcS2nWo/6LYwYyjrlN1bRfv+HKLbeGAGg=:
+
+ The HTTP message signature input string is calculated to be the
+ following:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ "@method": POST
+ "@target-uri": https://server.example.com/gnap
+ "content-digest": \
+ sha-256=:q2XBmzRDCREcS2nWo/6LYwYyjrlN1bRfv+HKLbeGAGg=:
+ "content-length": 988
+ "content-type": application/json
+ "@signature-params": ("@method" "@target-uri" "content-digest" \
+ "content-length" "content-type");created=1618884473\
+ ;keyid="gnap-rsa";nonce="NAOEJF12ER2";tag="gnap"
+
+ This leads to the following full HTTP message request:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ POST /gnap HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Content-Length: 988
+ Content-Digest: sha-256=:q2XBmzRDCREcS2nWo/6LYwYyjrlN1bRfv+HKLbeGAG\
+ g=:
+ Signature-Input: sig1=("@method" "@target-uri" "content-digest" \
+ "content-length" "content-type");created=1618884473\
+ ;keyid="gnap-rsa";nonce="NAOEJF12ER2";tag="gnap"
+ Signature: sig1=:c2uwTa6ok3iHZsaRKl1ediKlgd5cCAYztbym68XgX8gSOgK0Bt\
+ +zLJ19oGjSAHDjJxX2gXP2iR6lh9bLMTfPzbFVn4Eh+5UlceP+0Z5mES7v0R1+eHe\
+ OqBl0YlYKaSQ11YT7n+cwPnCSdv/6+62m5zwXEEftnBeA1ECorfTuPtau/yrTYEvD\
+ 9A/JqR2h9VzAE17kSlSSsDHYA6ohsFqcRJavX29duPZDfYgkZa76u7hJ23yVxoUpu\
+ 2J+7VUdedN/72N3u3/z2dC8vQXbzCPTOiLru12lb6vnBZoDbUGsRR/zHPauxhj9T+\
+ 218o5+tgwYXw17othJSxIIOZ9PkIgz4g==:
+
+ {
+ "access_token": {
+ "access": [
+ "dolphin-metadata"
+ ]
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.foo/callback",
+ "nonce": "VJLO6A4CAYLBXHTR0KRO"
+ }
+ },
+ "client": {
+ "key": {
+ "proof": "httpsig",
+ "jwk": {
+ "kid": "gnap-rsa",
+ "kty": "RSA",
+ "e": "AQAB",
+ "alg": "PS512",
+ "n": "hYOJ-XOKISdMMShn_G4W9m20mT0VWtQBsmBBkI2cmRt4Ai8Bf\
+ YdHsFzAtYKOjpBR1RpKpJmVKxIGNy0g6Z3ad2XYsh8KowlyVy8IkZ8NMwSrcUIBZG\
+ YXjHpwjzvfGvXH_5KJlnR3_uRUp4Z4Ujk2bCaKegDn11V2vxE41hqaPUnhRZxe0jR\
+ ETddzsE3mu1SK8dTCROjwUl14mUNo8iTrTm4n0qDadz8BkPo-uv4BC0bunS0K3bA_\
+ 3UgVp7zBlQFoFnLTO2uWp_muLEWGl67gBq9MO3brKXfGhi3kOzywzwPTuq-cVQDyE\
+ N7aL0SxCb3Hc4IdqDaMg8qHUyObpPitDQ"
+ }
+ }
+ "display": {
+ "name": "My Client Display Name",
+ "uri": "https://client.foo/"
+ },
+ }
+ }
+
+ The verifier MUST ensure that the signature covers all required
+ message components. If the HTTP message includes content, the
+ verifier MUST calculate and verify the value of the Content-Digest
+ header. The verifier MUST validate the signature against the
+ expected key of the signer.
+
+ A received message MAY include multiple signatures, each with its own
+ label. The verifier MUST examine all included signatures until it
+ finds (at least) one that is acceptable according to its policy and
+ meets the requirements in this section.
+
+7.3.1.1. Key Rotation Using HTTP Message Signatures
+
+ When rotating a key using HTTP message signatures, the message, which
+ includes the new public key value or reference, is first signed with
+ the old key following all of the requirements in Section 7.3.1. The
+ message is then signed again with the new key by following all of the
+ requirements in Section 7.3.1 again, with the following additional
+ requirements:
+
+ * The covered components MUST include the Signature and Signature-
+ Input values from the signature generated with the old key.
+
+ * The tag value MUST be gnap-rotate.
+
+ For example, the following request to the token management endpoint
+ for rotating a token value contains the new key in the request. The
+ message is first signed using the old key, and the resulting
+ signature is placed in "old-key":
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ POST /token/PRY5NM33 HTTP/1.1
+ Host: server.example.com
+ Authorization: GNAP 4398.34-12-asvDa.a
+ Content-Digest: sha-512=:Fb/A5vnawhuuJ5xk2RjGrbbxr6cvinZqd4+JPY85u/\
+ JNyTlmRmCOtyVhZ1Oz/cSS4tsYen6fzpCwizy6UQxNBQ==:
+ Signature-Input: old-key=("@method" "@target-uri" "content-digest" \
+ "authorization");created=1618884475;keyid="test-key-ecc-p256"\
+ ;tag="gnap"
+ Signature: old-key=:vN4IKYsJl2RLFe+tYEm4dHM4R4BToqx5D2FfH4ge5WOkgxo\
+ dI2QRrjB8rysvoSEGvAfiVJOWsGcPD1lU639Amw==:
+
+ {
+ "key": {
+ "proof": "httpsig",
+ "jwk": {
+ "kty": "RSA",
+ "e": "AQAB",
+ "kid": "xyz-2",
+ "alg": "RS256",
+ "n": "kOB5rR4Jv0GMeLaY6_It_r3ORwdf8ci_JtffXyaSx8xY..."
+ }
+ }
+ }
+
+ The signer then creates a new signature using the new key, adding the
+ signature input and value to the signature base.
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ "@method": POST
+ "@target-uri": https://server.example.com/token/PRY5NM33
+ "content-digest": sha-512=:Fb/A5vnawhuuJ5xk2RjGrbbxr6cvinZqd4+JPY85\
+ u/JNyTlmRmCOtyVhZ1Oz/cSS4tsYen6fzpCwizy6UQxNBQ==:
+ "authorization": GNAP 4398.34-12-asvDa.a
+ "signature";key="old-key": :YdDJjDn2Sq8FR82e5IcOLWmmf6wILoswlnRcz+n\
+ M+e8xjFDpWS2YmiMYDqUdri2UiJsZx63T1z7As9Kl6HTGkQ==:
+ "signature-input";key="old-key": ("@method" "@target-uri" \
+ "content-digest" "authorization");created=1618884475\
+ ;keyid="test-key-ecc-p256";tag="gnap"
+ "@signature-params": ("@method" "@target-uri" "content-digest" \
+ "authorization" "signature";key="old-key" "signature-input"\
+ ;key="old-key");created=1618884480;keyid="xyz-2"
+ ;tag="gnap-rotate"
+
+ This signature is then added to the message:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ POST /token/PRY5NM33 HTTP/1.1
+ Host: server.example.com
+ Authorization: GNAP 4398.34-12-asvDa.a
+ Content-Digest: sha-512=:Fb/A5vnawhuuJ5xk2RjGrbbxr6cvinZqd4+JPY85u/\
+ JNyTlmRmCOtyVhZ1Oz/cSS4tsYen6fzpCwizy6UQxNBQ==:
+ Signature-Input: old-key=("@method" "@target-uri" "content-digest" \
+ "authorization");created=1618884475;keyid="test-key-ecc-p256"\
+ ;tag="gnap", \
+ new-key=("@method" "@target-uri" "content-digest" \
+ "authorization" "signature";key="old-key" "signature-input"\
+ ;key="old-key");created=1618884480;keyid="xyz-2"
+ ;tag="gnap-rotate"
+ Signature: old-key=:vN4IKYsJl2RLFe+tYEm4dHM4R4BToqx5D2FfH4ge5WOkgxo\
+ dI2QRrjB8rysvoSEGvAfiVJOWsGcPD1lU639Amw==:, \
+ new-key=:VWUExXQ0geWeTUKhCfDT7WJyT++OHSVbfPA1ukW0o7mmstdbvIz9iOuH\
+ DRFzRBm0MQPFVMpLDFXQdE3vi2SL3ZjzcX2qLwzAtyRB9+RsV2caAA80A5ZGMoo\
+ gUsKPk4FFDN7KRUZ0vT9Mo9ycx9Dq/996TOWtAmq5z0YUYEwwn+T6+NcW8rFtms\
+ s1ZfXG0EoAfV6ve25p+x40Y1rvDHsfkakTRB4J8jWVDybSe39tjIKQBo3uicDVw\
+ twewBMNidIa+66iF3pWj8w9RSb0cncEgvbkHgASqaZeXmxxG4gM8p1HH9v/OqQT\
+ Oggm5gTWmCQs4oxEmWsfTOxefunfh3X+Qw==:
+
+ {
+ "key": {
+ "proof": "httpsig",
+ "jwk": {
+ "kty": "RSA",
+ "e": "AQAB",
+ "kid": "xyz-2",
+ "alg": "RS256",
+ "n": "kOB5rR4Jv0GMeLaY6_It_r3ORwdf8ci_JtffXyaSx8xY..."
+ }
+ }
+ }
+
+ The verifier MUST validate both signatures before processing the
+ request for key rotation.
+
+7.3.2. Mutual TLS
+
+ This method is indicated by the method value mtls in string form.
+
+ {
+ "proof": "mtls"
+ }
+
+ The signer presents its TLS client certificate during TLS negotiation
+ with the verifier.
+
+ In the following non-normative example, the certificate is
+ communicated to the application through the Client-Cert header field
+ from a TLS reverse proxy as per [RFC9440], leading to the following
+ full HTTP request message:
+
+ POST /gnap HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/jose
+ Content-Length: 1567
+ Client-Cert: \
+ :MIIC6jCCAdKgAwIBAgIGAXjw74xPMA0GCSqGSIb3DQEBCwUAMDYxNDAyBgNVBAMM\
+ K05JWU15QmpzRGp5QkM5UDUzN0Q2SVR6a3BEOE50UmppOXlhcEV6QzY2bVEwHhcN\
+ MjEwNDIwMjAxODU0WhcNMjIwMjE0MjAxODU0WjA2MTQwMgYDVQQDDCtOSVlNeUJq\
+ c0RqeUJDOVA1MzdENklUemtwRDhOdFJqaTl5YXBFekM2Nm1RMIIBIjANBgkqhkiG\
+ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhYOJ+XOKISdMMShn/G4W9m20mT0VWtQBsmBB\
+ kI2cmRt4Ai8BfYdHsFzAtYKOjpBR1RpKpJmVKxIGNy0g6Z3ad2XYsh8KowlyVy8I\
+ kZ8NMwSrcUIBZGYXjHpwjzvfGvXH/5KJlnR3/uRUp4Z4Ujk2bCaKegDn11V2vxE4\
+ 1hqaPUnhRZxe0jRETddzsE3mu1SK8dTCROjwUl14mUNo8iTrTm4n0qDadz8BkPo+\
+ uv4BC0bunS0K3bA/3UgVp7zBlQFoFnLTO2uWp/muLEWGl67gBq9MO3brKXfGhi3k\
+ OzywzwPTuq+cVQDyEN7aL0SxCb3Hc4IdqDaMg8qHUyObpPitDQIDAQABMA0GCSqG\
+ SIb3DQEBCwUAA4IBAQBnYFK0eYHy+hVf2D58usj39lhL5znb/q9G35GBd/XsWfCE\
+ wHuLOSZSUmG71bZtrOcx0ptle9bp2kKl4HlSTTfbtpuG5onSa3swRNhtKtUy5NH9\
+ W/FLViKWfoPS3kwoEpC1XqKY6l7evoTCtS+kTQRSrCe4vbNprCAZRxz6z1nEeCgu\
+ NMk38yTRvx8ihZpVOuU+Ih+dOtVe/ex5IAPYxlQsvtfhsUZqc7IyCcy72WHnRHlU\
+ fn3pJm0S5270+Yls3Iv6h3oBAP19i906UjiUTNH3g0xMW+V4uLxgyckt4wD4Mlyv\
+ jnaQ7Z3sR6EsXMocAbXHIAJhwKdtU/fLgdwL5vtx:
+
+
+ {
+ "access_token": {
+ "access": [
+ "dolphin-metadata"
+ ]
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.foo/callback",
+ "nonce": "VJLO6A4CAYLBXHTR0KRO"
+ }
+ },
+ "client": {
+ "key": {
+ "proof": "mtls",
+ "cert": "MIIC6jCCAdKgAwIBAgIGAXjw74xPMA0GCSqGSIb3DQEBCwUAMD\
+ YxNDAyBgNVBAMMK05JWU15QmpzRGp5QkM5UDUzN0Q2SVR6a3BEOE50UmppOXlhcEV\
+ 6QzY2bVEwHhcNMjEwNDIwMjAxODU0WhcNMjIwMjE0MjAxODU0WjA2MTQwMgYDVQQD\
+ DCtOSVlNeUJqc0RqeUJDOVA1MzdENklUemtwRDhOdFJqaTl5YXBFekM2Nm1RMIIBI\
+ jANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhYOJ+XOKISdMMShn/G4W9m20mT\
+ 0VWtQBsmBBkI2cmRt4Ai8BfYdHsFzAtYKOjpBR1RpKpJmVKxIGNy0g6Z3ad2XYsh8\
+ KowlyVy8IkZ8NMwSrcUIBZGYXjHpwjzvfGvXH/5KJlnR3/uRUp4Z4Ujk2bCaKegDn\
+ 11V2vxE41hqaPUnhRZxe0jRETddzsE3mu1SK8dTCROjwUl14mUNo8iTrTm4n0qDad\
+ z8BkPo+uv4BC0bunS0K3bA/3UgVp7zBlQFoFnLTO2uWp/muLEWGl67gBq9MO3brKX\
+ fGhi3kOzywzwPTuq+cVQDyEN7aL0SxCb3Hc4IdqDaMg8qHUyObpPitDQIDAQABMA0\
+ GCSqGSIb3DQEBCwUAA4IBAQBnYFK0eYHy+hVf2D58usj39lhL5znb/q9G35GBd/Xs\
+ WfCEwHuLOSZSUmG71bZtrOcx0ptle9bp2kKl4HlSTTfbtpuG5onSa3swRNhtKtUy5\
+ NH9W/FLViKWfoPS3kwoEpC1XqKY6l7evoTCtS+kTQRSrCe4vbNprCAZRxz6z1nEeC\
+ guNMk38yTRvx8ihZpVOuU+Ih+dOtVe/ex5IAPYxlQsvtfhsUZqc7IyCcy72WHnRHl\
+ Ufn3pJm0S5270+Yls3Iv6h3oBAP19i906UjiUTNH3g0xMW+V4uLxgyckt4wD4Mlyv\
+ jnaQ7Z3sR6EsXMocAbXHIAJhwKdtU/fLgdwL5vtx"
+ }
+ "display": {
+ "name": "My Client Display Name",
+ "uri": "https://client.foo/"
+ },
+ },
+ "subject": {
+ "formats": ["iss_sub", "opaque"]
+ }
+ }
+
+ The verifier compares the TLS client certificate presented during
+ MTLS negotiation to the expected key of the signer. Since the TLS
+ connection covers the entire message, there are no additional
+ requirements to check.
+
+ Note that in many instances, the verifier will not do a full
+ certificate chain validation of the presented TLS client certificate,
+ as the means of trust for this certificate could be in something
+ other than a PKI system, such as a static registration or trust-on-
+ first-use. See Sections 11.3 and 11.4 for some additional
+ considerations for this key proofing method.
+
+7.3.2.1. Key Rotation Using MTLS
+
+ Since it is not possible to present two client authenticated
+ certificates to a MTLS connection simultaneously, dynamic key
+ rotation for this proofing method is not defined. Instead, key
+ rotation for MTLS-based client instances is expected to be managed
+ through deployment practices, as discussed in Section 11.4.
+
+7.3.3. Detached JWS
+
+ This method is indicated by the method value jwsd in string form.
+
+ {
+ "proof": "jwsd"
+ }
+
+ The signer creates a JSON Web Signature (JWS) [RFC7515] object as
+ follows.
+
+ To protect the request, the JOSE header of the signature contains the
+ following claims:
+
+ kid (string): The key identifier. REQUIRED if the key is presented
+ in JWK format. This MUST be the value of the kid field of the
+ key.
+
+ alg (string): The algorithm used to sign the request. The algorithm
+ MUST be appropriate to the key presented. If the key is presented
+ as a JWK, this MUST be equal to the alg parameter of the key. The
+ algorithm MUST NOT be none. REQUIRED.
+
+ typ (string): The type header, value "gnap-binding-jwsd". REQUIRED.
+
+ htm (string): The HTTP method used to make this request, as a case-
+ sensitive ASCII string. Note that most public HTTP methods are in
+ uppercase ASCII by convention. REQUIRED.
+
+ uri (string): The HTTP URI used for this request. This value MUST
+ be an absolute URI, including all path and query components and no
+ fragment components. REQUIRED.
+
+ created (integer): A timestamp of when the signature was created, in
+ integer seconds since UNIX Epoch. REQUIRED.
+
+ When the request is bound to an access token, the JOSE header MUST
+ also include the following:
+
+ ath (string): The hash of the access token. The value MUST be the
+ result of base64url encoding (with no padding) the SHA-256 digest
+ of the ASCII encoding of the associated access token's value.
+ REQUIRED.
+
+ If the HTTP request has content (such as an HTTP POST or PUT method),
+ the payload of the JWS object is the base64url encoding (without
+ padding) of the SHA-256 digest of the bytes of the content. If the
+ request being made does not have content (such as an HTTP GET,
+ OPTIONS, or DELETE method), the JWS signature is calculated over an
+ empty payload.
+
+ The signer presents the signed object in compact form [RFC7515] in
+ the Detached-JWS header field.
+
+ In the following non-normative example, the JOSE header contains the
+ following parameters:
+
+ {
+ "alg": "RS256",
+ "kid": "gnap-rsa",
+ "uri": "https://server.example.com/gnap",
+ "htm": "POST",
+ "typ": "gnap-binding-jwsd",
+ "created": 1618884475
+ }
+
+ The request content is the following JSON object:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ {
+ "access_token": {
+ "access": [
+ "dolphin-metadata"
+ ]
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.foo/callback",
+ "nonce": "VJLO6A4CAYLBXHTR0KRO"
+ }
+ },
+ "client": {
+ "key": {
+ "proof": "jwsd",
+ "jwk": {
+ "kid": "gnap-rsa",
+ "kty": "RSA",
+ "e": "AQAB",
+ "alg": "RS256",
+ "n": "hYOJ-XOKISdMMShn_G4W9m20mT0VWtQBsmBBkI2cmRt4Ai8Bf\
+ YdHsFzAtYKOjpBR1RpKpJmVKxIGNy0g6Z3ad2XYsh8KowlyVy8IkZ8NMwSrcUIBZG\
+ YXjHpwjzvfGvXH_5KJlnR3_uRUp4Z4Ujk2bCaKegDn11V2vxE41hqaPUnhRZxe0jR\
+ ETddzsE3mu1SK8dTCROjwUl14mUNo8iTrTm4n0qDadz8BkPo-uv4BC0bunS0K3bA_\
+ 3UgVp7zBlQFoFnLTO2uWp_muLEWGl67gBq9MO3brKXfGhi3kOzywzwPTuq-cVQDyE\
+ N7aL0SxCb3Hc4IdqDaMg8qHUyObpPitDQ"
+ }
+ }
+ "display": {
+ "name": "My Client Display Name",
+ "uri": "https://client.foo/"
+ },
+ }
+ }
+
+ This is hashed to the following base64-encoded value:
+
+ PGiVuOZUcN1tRtUS6tx2b4cBgw9mPgXG3IPB3wY7ctc
+
+ This leads to the following full HTTP request message:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ POST /gnap HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Content-Length: 983
+ Detached-JWS: eyJhbGciOiJSUzI1NiIsImNyZWF0ZWQiOjE2MTg4ODQ0NzUsImh0b\
+ SI6IlBPU1QiLCJraWQiOiJnbmFwLXJzYSIsInR5cCI6ImduYXAtYmluZGluZytqd3\
+ NkIiwidXJpIjoiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20vZ25hcCJ9.PGiVuO\
+ ZUcN1tRtUS6tx2b4cBgw9mPgXG3IPB3wY7ctc.fUq-SV-A1iFN2MwCRW_yolVtT2_\
+ TZA2h5YeXUoi5F2Q2iToC0Tc4drYFOSHIX68knd68RUA7yHqCVP-ZQEd6aL32H69e\
+ 9zuMiw6O_s4TBKB3vDOvwrhYtDH6fX2hP70cQoO-47OwbqP-ifkrvI3hVgMX9TfjV\
+ eKNwnhoNnw3vbu7SNKeqJEbbwZfpESaGepS52xNBlDNMYBQQXxM9OqKJaXffzLFEl\
+ -Xe0UnfolVtBraz3aPrPy1C6a4uT7wLda3PaTOVtgysxzii3oJWpuz0WP5kRujzDF\
+ wX_EOzW0jsjCSkL-PXaKSpZgEjNjKDMg9irSxUISt1C1T6q3SzRgfuQ
+
+
+ {
+ "access_token": {
+ "access": [
+ "dolphin-metadata"
+ ]
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.foo/callback",
+ "nonce": "VJLO6A4CAYLBXHTR0KRO"
+ }
+ },
+ "client": {
+ "key": {
+ "proof": "jwsd",
+ "jwk": {
+ "kid": "gnap-rsa",
+ "kty": "RSA",
+ "e": "AQAB",
+ "alg": "RS256",
+ "n": "hYOJ-XOKISdMMShn_G4W9m20mT0VWtQBsmBBkI2cmRt4Ai8Bf\
+ YdHsFzAtYKOjpBR1RpKpJmVKxIGNy0g6Z3ad2XYsh8KowlyVy8IkZ8NMwSrcUIBZG\
+ YXjHpwjzvfGvXH_5KJlnR3_uRUp4Z4Ujk2bCaKegDn11V2vxE41hqaPUnhRZxe0jR\
+ ETddzsE3mu1SK8dTCROjwUl14mUNo8iTrTm4n0qDadz8BkPo-uv4BC0bunS0K3bA_\
+ 3UgVp7zBlQFoFnLTO2uWp_muLEWGl67gBq9MO3brKXfGhi3kOzywzwPTuq-cVQDyE\
+ N7aL0SxCb3Hc4IdqDaMg8qHUyObpPitDQ"
+ }
+ }
+ "display": {
+ "name": "My Client Display Name",
+ "uri": "https://client.foo/"
+ },
+ }
+ }
+
+ When the verifier receives the Detached-JWS header, it MUST parse and
+ validate the JWS object. The signature MUST be validated against the
+ expected key of the signer. If the HTTP message request contains
+ content, the verifier MUST calculate the hash of the content just as
+ the signer does, with no normalization or transformation of the
+ request. All required fields MUST be present, and their values MUST
+ be valid. All fields MUST match the corresponding portions of the
+ HTTP message. For example, the htm field of the JWS header has to be
+ the same as the HTTP verb used in the request.
+
+ Note that this proofing method depends on a specific cryptographic
+ algorithm, SHA-256, in two ways: 1) the ath hash algorithm is
+ hardcoded and 2) the payload of the detached/attached signature is
+ computed using a hardcoded hash. A future version of this document
+ may address crypto-agility for both these uses by replacing ath with
+ a new header that upgrades the algorithm and possibly defining a new
+ JWS header that indicates the HTTP content's hash method.
+
+7.3.3.1. Key Rotation Using Detached JWS
+
+ When rotating a key using detached JWS, the message, which includes
+ the new public key value or reference, is first signed with the old
+ key as described above using a JWS object with typ header value
+ "gnap-binding-rotation-jwsd". The value of the JWS object is then
+ taken as the payload of a new JWS object, to be signed by the new key
+ using the parameters above.
+
+ The value of the new JWS object is sent in the Detached-JWS header.
+
+7.3.4. Attached JWS
+
+ This method is indicated by the method value jws in string form.
+
+ {
+ "proof": "jws"
+ }
+
+ The signer creates a JWS [RFC7515] object as follows.
+
+ To protect the request, the JWS header contains the following claims:
+
+ kid (string): The key identifier. REQUIRED if the key is presented
+ in JWK format. This MUST be the value of the kid field of the
+ key.
+
+ alg (string): The algorithm used to sign the request. MUST be
+ appropriate to the key presented. If the key is presented as a
+ JWK, this MUST be equal to the alg parameter of the key. MUST NOT
+ be none. REQUIRED.
+
+ typ (string): The type header, value "gnap-binding-jws". REQUIRED.
+
+ htm (string): The HTTP method used to make this request, as a case-
+ sensitive ASCII string. (Note that most public HTTP methods are
+ in uppercase.) REQUIRED.
+
+ uri (string): The HTTP URI used for this request, including all path
+ and query components and no fragment components. REQUIRED.
+
+ created (integer): A timestamp of when the signature was created, in
+ integer seconds since UNIX Epoch. REQUIRED.
+
+ When the request is bound to an access token, the JOSE header MUST
+ also include the following:
+
+ ath (string): The hash of the access token. The value MUST be the
+ result of base64url encoding (with no padding) the SHA-256 digest
+ of the ASCII encoding of the associated access token's value.
+ REQUIRED.
+
+ If the HTTP request has content (such as an HTTP POST or PUT method),
+ the payload of the JWS object is the JSON serialized content of the
+ request, and the object is signed according to JWS and serialized
+ into compact form [RFC7515]. The signer presents the JWS as the
+ content of the request along with a content type of application/jose.
+ The verifier MUST extract the payload of the JWS and treat it as the
+ request content for further processing.
+
+ If the request being made does not have content (such as an HTTP GET,
+ OPTIONS, or DELETE method), the JWS signature is calculated over an
+ empty payload and passed in the Detached-JWS header as described in
+ Section 7.3.3.
+
+ In the following non-normative example, the JOSE header contains the
+ following parameters:
+
+ {
+ "alg": "RS256",
+ "kid": "gnap-rsa",
+ "uri": "https://server.example.com/gnap",
+ "htm": "POST",
+ "typ": "gnap-binding-jws",
+ "created": 1618884475
+ }
+
+ The request content, used as the JWS Payload, is the following JSON
+ object:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ {
+ "access_token": {
+ "access": [
+ "dolphin-metadata"
+ ]
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.foo/callback",
+ "nonce": "VJLO6A4CAYLBXHTR0KRO"
+ }
+ },
+ "client": {
+ "key": {
+ "proof": "jws",
+ "jwk": {
+ "kid": "gnap-rsa",
+ "kty": "RSA",
+ "e": "AQAB",
+ "alg": "RS256",
+ "n": "hYOJ-XOKISdMMShn_G4W9m20mT0VWtQBsmBBkI2cmRt4Ai8Bf\
+ YdHsFzAtYKOjpBR1RpKpJmVKxIGNy0g6Z3ad2XYsh8KowlyVy8IkZ8NMwSrcUIBZG\
+ YXjHpwjzvfGvXH_5KJlnR3_uRUp4Z4Ujk2bCaKegDn11V2vxE41hqaPUnhRZxe0jR\
+ ETddzsE3mu1SK8dTCROjwUl14mUNo8iTrTm4n0qDadz8BkPo-uv4BC0bunS0K3bA_\
+ 3UgVp7zBlQFoFnLTO2uWp_muLEWGl67gBq9MO3brKXfGhi3kOzywzwPTuq-cVQDyE\
+ N7aL0SxCb3Hc4IdqDaMg8qHUyObpPitDQ"
+ }
+ }
+ "display": {
+ "name": "My Client Display Name",
+ "uri": "https://client.foo/"
+ },
+ },
+ "subject": {
+ "formats": ["iss_sub", "opaque"]
+ }
+ }
+
+ This leads to the following full HTTP request message:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ POST /gnap HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/jose
+ Content-Length: 1047
+
+ eyJhbGciOiJSUzI1NiIsImNyZWF0ZWQiOjE2MTg4ODQ0NzUsImh0bSI6IlBPU1QiLCJ\
+ raWQiOiJnbmFwLXJzYSIsInR5cCI6ImduYXAtYmluZGluZytqd3NkIiwidXJpIjoiaH\
+ R0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20vZ25hcCJ9.CnsKICAgICJhY2Nlc3NfdG9r\
+ ZW4iOiB7CiAgICAgICAgImFjY2VzcyI6IFsKICAgICAgICAgICAgImRvbHBoaW4tbWV\
+ 0YWRhdGEiCiAgICAgICAgXQogICAgfSwKICAgICJpbnRlcmFjdCI6IHsKICAgICAgIC\
+ Aic3RhcnQiOiBbInJlZGlyZWN0Il0sCiAgICAgICAgImZpbmlzaCI6IHsKICAgICAgI\
+ CAgICAgIm1ldGhvZCI6ICJyZWRpcmVjdCIsCiAgICAgICAgICAgICJ1cmkiOiAiaHR0\
+ cHM6Ly9jbGllbnQuZm9vL2NhbGxiYWNrIiwKICAgICAgICAgICAgIm5vbmNlIjogIlZ\
+ KTE82QTRDQVlMQlhIVFIwS1JPIgogICAgICAgIH0KICAgIH0sCiAgICAiY2xpZW50Ij\
+ ogewogICAgICAicHJvb2YiOiAiandzIiwKICAgICAgImtleSI6IHsKICAgICAgICAia\
+ ndrIjogewogICAgICAgICAgICAia2lkIjogImduYXAtcnNhIiwKICAgICAgICAgICAg\
+ Imt0eSI6ICJSU0EiLAogICAgICAgICAgICAiZSI6ICJBUUFCIiwKICAgICAgICAgICA\
+ gImFsZyI6ICJSUzI1NiIsCiAgICAgICAgICAgICJuIjogImhZT0otWE9LSVNkTU1TaG\
+ 5fRzRXOW0yMG1UMFZXdFFCc21CQmtJMmNtUnQ0QWk4QmZZZEhzRnpBdFlLT2pwQlIxU\
+ nBLcEptVkt4SUdOeTBnNlozYWQyWFlzaDhLb3dseVZ5OElrWjhOTXdTcmNVSUJaR1lY\
+ akhwd2p6dmZHdlhIXzVLSmxuUjNfdVJVcDRaNFVqazJiQ2FLZWdEbjExVjJ2eEU0MWh\
+ xYVBVbmhSWnhlMGpSRVRkZHpzRTNtdTFTSzhkVENST2p3VWwxNG1VTm84aVRyVG00bj\
+ BxRGFkejhCa1BvLXV2NEJDMGJ1blMwSzNiQV8zVWdWcDd6QmxRRm9GbkxUTzJ1V3Bfb\
+ XVMRVdHbDY3Z0JxOU1PM2JyS1hmR2hpM2tPenl3endQVHVxLWNWUUR5RU43YUwwU3hD\
+ YjNIYzRJZHFEYU1nOHFIVXlPYnBQaXREUSIKICAgICAgICB9CiAgICAgIH0KICAgICA\
+ gImRpc3BsYXkiOiB7CiAgICAgICAgIm5hbWUiOiAiTXkgQ2xpZW50IERpc3BsYXkgTm\
+ FtZSIsCiAgICAgICAgInVyaSI6ICJodHRwczovL2NsaWVudC5mb28vIgogICAgICB9L\
+ AogICAgfSwKICAgICJzdWJqZWN0IjogewogICAgICAgICJmb3JtYXRzIjogWyJpc3Nf\
+ c3ViIiwgIm9wYXF1ZSJdCiAgICB9Cn0K.MwNoVMQp5hVxI0mCs9LlOUdFtkDXaA1_eT\
+ vOXq7DOGrtDKH7q4vP2xUq3fH2jRAZqnobo0WdPP3eM3NH5QUjW8pa6_QpwdIWkK7r-\
+ u_52puE0lPBp7J4U2w4l9gIbg8iknsmWmXeY5F6wiGT8ptfuEYGgmloAJd9LIeNvD3U\
+ LW2h2dz1Pn2eDnbyvgB0Ugae0BoZB4f69fKWj8Z9wvTIjk1LZJN1PcL7_zT8Lrlic9a\
+ PyzT7Q9ovkd1s-4whE7TrnGUzFc5mgWUn_gsOpsP5mIIljoEEv-FqOW2RyNYulOZl0Q\
+ 8EnnDHV_vPzrHlUarbGg4YffgtwkQhdK72-JOxYQ
+
+ When the verifier receives an attached JWS request, it MUST parse and
+ validate the JWS object. The signature MUST be validated against the
+ expected key of the signer. All required fields MUST be present, and
+ their values MUST be valid. All fields MUST match the corresponding
+ portions of the HTTP message. For example, the htm field of the JWS
+ header has to be the same as the HTTP verb used in the request.
+
+ Note that this proofing method depends on a specific cryptographic
+ algorithm, SHA-256, in two ways: the ath hash algorithm is hardcoded,
+ and computing the payload of the detached/attached signature also
+ uses a hardcoded hash. A future version of this document may address
+ crypto-agility for both these uses by replacing ath with a new header
+ that upgrades the algorithm and possibly defining a new header that
+ indicates the HTTP content's hash method.
+
+7.3.4.1. Key Rotation Using Attached JWS
+
+ When rotating a key using attached JWS, the message, which includes
+ the new public key value or reference, is first signed with the old
+ key using a JWS object with typ header value "gnap-binding-rotation-
+ jws". The value of the JWS object is then taken as the payload of a
+ new JWS object, to be signed by the new key.
+
+8. Resource Access Rights
+
+ GNAP provides a rich structure for describing the protected resources
+ hosted by RSs and accessed by client software. This structure is
+ used when the client instance requests an access token (Section 2.1)
+ and when an access token is returned (Section 3.2). GNAP's structure
+ is designed to be analogous to the OAuth 2.0 Rich Authorization
+ Requests data structure defined in [RFC9396].
+
+ The root of this structure is a JSON array. The elements of the JSON
+ array represent rights of access that are associated with the access
+ token. Individual rights of access can be defined by the RS as
+ either an object or a string. The resulting access is the union of
+ all elements within the array.
+
+ The access associated with the access token is described using
+ objects that each contain multiple dimensions of access. Each object
+ contains a REQUIRED type property that determines the type of API
+ that the token is used for and the structure of the rest of the
+ object. There is no expected interoperability between different type
+ definitions.
+
+ type (string): The type of resource request as a string. This field
+ MAY define which other fields are allowed in the request object.
+ REQUIRED.
+
+ The value of the type field is under the control of the AS. This
+ field MUST be compared using an exact byte match of the string value
+ against known types by the AS. The AS MUST ensure that there is no
+ collision between different authorization data types that it
+ supports. The AS MUST NOT do any collation or normalization of data
+ types during comparison. It is RECOMMENDED that designers of
+ general-purpose APIs use a URI for this field to avoid collisions
+ between multiple API types protected by a single AS.
+
+ While it is expected that many APIs will have their own properties,
+ this specification defines a set of common data fields that are
+ designed to be usable across different types of APIs. This
+ specification does not require the use of these common fields by an
+ API definition but, instead, provides them as reusable generic
+ components for API designers to make use of. The allowable values of
+ all fields are determined by the API being protected, as defined by a
+ particular type value.
+
+ actions (array of strings): The types of actions the client instance
+ will take at the RS as an array of strings (for example, a client
+ instance asking for a combination of "read" and "write" access).
+
+ locations (array of strings): The location of the RS as an array of
+ strings. These strings are typically URIs identifying the
+ location of the RS.
+
+ datatypes (array of strings): The kinds of data available to the
+ client instance at the RS's API as an array of strings (for
+ example, a client instance asking for access to raw "image" data
+ and "metadata" at a photograph API).
+
+ identifier (string): A string identifier indicating a specific
+ resource at the RS (for example, a patient identifier for a
+ medical API or a bank account number for a financial API).
+
+ privileges (array of strings): The types or levels of privilege
+ being requested at the resource (for example, a client instance
+ asking for administrative-level access or access when the RO is no
+ longer online).
+
+ The following non-normative example describes three kinds of access
+ (read, write, and delete) to each of two different locations and two
+ different data types (metadata and images) for a single access token
+ using the fictitious photo-api type definition.
+
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [
+ "read",
+ "write",
+ "delete"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ]
+ }
+ ]
+
+ While the exact semantics of interpreting the fields of an access
+ request object are subject to the definition of the type, it is
+ expected that the access requested for each object in the array is
+ the cross-product of all fields of the object. That is to say, the
+ object represents a request for all actions listed to be used at all
+ locations listed for all possible datatypes listed within the object.
+ Assuming the request above was granted, the client instance could
+ assume that it would be able to do a read action against the images
+ on the first server as well as a delete action on the metadata of the
+ second server, or any other combination of these fields, using the
+ same access token.
+
+ To request a different combination of access, such as requesting one
+ of the possible actions against one of the possible locations and a
+ different choice of possible actions against a different one of the
+ possible locations, the client instance can include multiple separate
+ objects in the resources array. The total access rights for the
+ resulting access token are the union of all objects. The following
+ non-normative example uses the same fictitious photo-api type
+ definition to request a single access token with more specifically
+ targeted access rights by using two discrete objects within the
+ request.
+
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [
+ "read"
+ ],
+ "locations": [
+ "https://server.example.net/"
+ ],
+ "datatypes": [
+ "images"
+ ]
+ },
+ {
+ "type": "photo-api",
+ "actions": [
+ "write",
+ "delete"
+ ],
+ "locations": [
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata"
+ ]
+ }
+ ]
+
+ The access requested here is for read access to images on one server
+ as well as write and delete access for metadata on a different server
+ (importantly, without requesting write or delete access to images on
+ the first server).
+
+ It is anticipated that API designers will use a combination of common
+ fields defined in this specification as well as fields specific to
+ the API itself. The following non-normative example shows the use of
+ both common and API-specific fields as part of two different
+ fictitious API type values. The first access request includes the
+ actions, locations, and datatypes fields specified here as well as
+ the API-specific geolocation field. The second access request
+ includes the actions and identifier fields specified here as well as
+ the API-specific currency field.
+
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [
+ "read",
+ "write"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ],
+ "geolocation": [
+ { lat: -32.364, lng: 153.207 },
+ { lat: -35.364, lng: 158.207 }
+ ]
+ },
+ {
+ "type": "financial-transaction",
+ "actions": [
+ "withdraw"
+ ],
+ "identifier": "account-14-32-32-3",
+ "currency": "USD"
+ }
+ ]
+
+ If this request is approved, the resulting access token's access
+ rights will be the union of the requested types of access for each of
+ the two APIs, just as above.
+
+8.1. Requesting Resources by Reference
+
+ Instead of sending an object describing the requested resource
+ (Section 8), access rights MAY be communicated as a string known to
+ the AS representing the access being requested. Just like access
+ rights communicated as an object, access rights communicated as
+ reference strings indicate a specific access at a protected resource.
+ In the following non-normative example, three distinct resource
+ access rights are being requested.
+
+ "access": [
+ "read", "dolphin-metadata", "some other thing"
+ ]
+
+ This value is opaque to the client instance and MAY be any valid JSON
+ string; therefore, it could include spaces, Unicode characters, and
+ properly escaped string sequences. However, in some situations, the
+ value is intended to be seen and understood by the client software's
+ developer. In such cases, the API designer choosing any such human-
+ readable strings SHOULD take steps to ensure the string values are
+ not easily confused by a developer, such as by limiting the strings
+ to easily disambiguated characters.
+
+ This functionality is similar in practice to OAuth 2.0's scope
+ parameter [RFC6749], where a single string represents the set of
+ access rights requested by the client instance. As such, the
+ reference string could contain any valid OAuth 2.0 scope value, as in
+ Appendix B.5. Note that the reference string here is not bound to
+ the same character restrictions as OAuth 2.0's scope definition.
+
+ A single access array MAY include both object-type and string-type
+ resource items. In this non-normative example, the client instance
+ is requesting access to a photo-api and financial-transaction API
+ type as well as the reference values of read, dolphin-metadata, and
+ some other thing.
+
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [
+ "read",
+ "write",
+ "delete"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ]
+ },
+ "read",
+ "dolphin-metadata",
+ {
+ "type": "financial-transaction",
+ "actions": [
+ "withdraw"
+ ],
+ "identifier": "account-14-32-32-3",
+ "currency": "USD"
+ },
+ "some other thing"
+ ]
+
+ The requested access is the union of all elements of the array,
+ including both objects and reference strings.
+
+ In order to facilitate the use of both object and reference strings
+ to access the same kind of APIs, the API designer can define a clear
+ mapping between these forms. One possible approach for choosing
+ reference string values is to use the same value as the type
+ parameter from the fully specified object, with the API defining a
+ set of default behaviors in this case. For example, an API
+ definition could declare the following string:
+
+ "access": [
+ "photo-api"
+ ]
+
+ As being equivalent to the following fully defined object:
+
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [ "read", "write", "delete" ],
+ "datatypes": [ "metadata", "image" ]
+ }
+ ]
+
+ The exact mechanisms for relating reference strings is up to the API
+ designer. These are enforced by the AS, and the details are out of
+ scope for this specification.
+
+9. Discovery
+
+ By design, GNAP minimizes the need for any pre-flight discovery. To
+ begin a request, the client instance only needs to know the grant
+ endpoint of the AS (a single URI) and which keys it will use to sign
+ the request. Everything else can be negotiated dynamically in the
+ course of the protocol.
+
+ However, the AS can have limits on its allowed functionality. If the
+ client instance wants to optimize its calls to the AS before making a
+ request, it MAY send an HTTP OPTIONS request to the grant request
+ endpoint to retrieve the server's discovery information. The AS MUST
+ respond with a JSON document with Content-Type application/json
+ containing a single object with the following fields:
+
+ grant_request_endpoint (string): The location of the AS's grant
+ request endpoint. The location MUST be an absolute URL [RFC3986]
+ with a scheme component (which MUST be "https"), a host component,
+ and optionally port, path, and query components and no fragment
+ components. This URL MUST match the URL the client instance used
+ to make the discovery request. REQUIRED.
+
+ interaction_start_modes_supported (array of strings): A list of the
+ AS's interaction start methods. The values of this list
+ correspond to the possible values for the interaction start field
+ of the request (Section 2.5.1) and MUST be values from the "GNAP
+ Interaction Start Modes" registry (Section 10.9). OPTIONAL.
+
+ interaction_finish_methods_supported (array of strings): A list of
+ the AS's interaction finish methods. The values of this list
+ correspond to the possible values for the method element of the
+ interaction finish field of the request (Section 2.5.2) and MUST
+ be values from the "GNAP Interaction Finish Methods" registry
+ (Section 10.10). OPTIONAL.
+
+ key_proofs_supported (array of strings): A list of the AS's
+ supported key proofing mechanisms. The values of this list
+ correspond to possible values of the proof field of the key
+ section of the request (Section 7.1) and MUST be values from the
+ "GNAP Key Proofing Methods" registry (Section 10.16). OPTIONAL.
+
+ sub_id_formats_supported (array of strings): A list of the AS's
+ supported Subject Identifier formats. The values of this list
+ correspond to possible values of the Subject Identifier field of
+ the request (Section 2.2) and MUST be values from the "Subject
+ Identifier Formats" registry [Subj-ID-Formats]. OPTIONAL.
+
+ assertion_formats_supported (array of strings): A list of the AS's
+ supported assertion formats. The values of this list correspond
+ to possible values of the subject assertion field of the request
+ (Section 2.2) and MUST be values from the "GNAP Assertion Formats"
+ registry (Section 10.6). OPTIONAL.
+
+ key_rotation_supported (boolean): The boolean "true" indicates that
+ rotation of access token bound keys by the client (Section 6.1.1)
+ is supported by the AS. The absence of this field or a boolean
+ "false" value indicates that this feature is not supported.
+
+ The information returned from this method is for optimization
+ purposes only. The AS MAY deny any request, or any portion of a
+ request, even if it lists a capability as supported. For example, if
+ a given client instance can be registered with the mtls key proofing
+ mechanism but the AS also returns other proofing methods from the
+ discovery document, then the AS will still deny a request from that
+ client instance using a different proofing mechanism. Similarly, an
+ AS with key_rotation_supported set to "true" can still deny any
+ request for rotating any access token's key for a variety of reasons.
+
+ Additional fields can be defined in the "GNAP Authorization Server
+ Discovery Fields" registry (Section 10.18).
+
+9.1. RS-First Method of AS Discovery
+
+ If the client instance calls an RS without an access token or with an
+ invalid access token, the RS SHOULD be explicit about the fact that
+ GNAP needs to be used to access the resource by responding with the
+ WWW-Authenticate header field and a GNAP challenge.
+
+ In some situations, the client instance might want to know with which
+ specific AS it needs to negotiate for access to that RS. The RS MAY
+ additionally return the following OPTIONAL parameters:
+
+ as_uri: The URI of the grant endpoint of the GNAP AS. Used by the
+ client instance to call the AS to request an access token.
+
+ referrer: The URI of the GNAP RS. Sent by the client instance in
+ the Referer header as part of the grant request.
+
+ access: An opaque access reference as defined in Section 8.1. MUST
+ be sufficient for at least the action the client instance was
+ attempting to take at the RS and MAY allow additional access
+ rights as well. Sent by the client as an access right in the
+ grant request.
+
+ The client instance SHOULD then use both the referrer and access
+ parameters in its access token request. The client instance MUST
+ check that the referrer parameter is equal to the URI of the RS using
+ the simple string comparison method in Section 6.2.1 of [RFC3986].
+
+ The means for the RS to determine the value for the access reference
+ are out of scope of this specification, but some dynamic methods are
+ discussed in [GNAP-RS].
+
+ When receiving the following response from the RS:
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ WWW-Authenticate: \
+ GNAP as_uri=https://as.example/tx\
+ ;access=FWWIKYBQ6U56NL1\
+ ;referrer=https://rs.example
+
+ The client instance then makes a request to the as_uri as described
+ in Section 2, with the value of referrer passed as an HTTP Referer
+ header field and the access reference passed unchanged into the
+ access array in the access_token portion of the request. The client
+ instance MAY request additional resources and other information.
+
+ In the following non-normative example, the client instance is
+ requesting a single access token using the opaque access reference
+ FWWIKYBQ6U56NL1 received from the RS in addition to the dolphin-
+ metadata that the client instance has been configured with out of
+ band.
+
+ POST /tx HTTP/1.1
+ Host: as.example
+ Referer: https://rs.example/resource
+ Content-Type: application/json
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "access_token": {
+ "access": [
+ "FWWIKYBQ6U56NL1",
+ "dolphin-metadata"
+ ]
+ },
+ "client": "KHRS6X63AJ7C7C4AZ9AO"
+ }
+
+ The client instance includes the Referer header field as a way for
+ the AS to know that the process is initiated through a discovery
+ process at the RS.
+
+ If issued, the resulting access token would contain sufficient access
+ to be used at both referenced resources.
+
+ Security considerations, especially related to the potential of a
+ compromised RS (Section 11.37) redirecting the requests of an
+ otherwise properly authenticated client, need to be carefully
+ considered when allowing such a discovery process. This risk can be
+ mitigated by an alternative pre-registration process so that the
+ client knows which AS protects which RS. There are also privacy
+ considerations related to revealing which AS is protecting a given
+ resource; these are discussed in Section 12.4.1.
+
+9.2. Dynamic Grant Endpoint Discovery
+
+ Additional methods of discovering the appropriate grant endpoint for
+ a given application are outside the scope of this specification.
+ This limitation is intentional, as many applications rely on static
+ configuration between the client instance and AS, as is common in
+ OAuth 2.0. However, the dynamic nature of GNAP makes it a prime
+ candidate for other extensions defining methods for discovery of the
+ appropriate AS grant endpoint at runtime. Advanced use cases could
+ define contextual methods for securely providing this endpoint to the
+ client instance. Furthermore, GNAP's design intentionally requires
+ the client instance to only know the grant endpoint and not
+ additional parameters, since other functions and values can be
+ disclosed and negotiated during the grant process.
+
+10. IANA Considerations
+
+ IANA has added values to existing registries as well as created 16
+ registries for GNAP [GNAP-REG] and populated those registries with
+ initial values as described in this section.
+
+ All use of value typing is based on data types in [RFC8259] and MUST
+ be one of the following: number, object, string, boolean, or array.
+ When the type is array, the contents of the array MUST be specified,
+ as in "array of objects" when one subtype is allowed or "array of
+ strings/objects" when multiple simultaneous subtypes are allowed.
+ When the type is object, the structure of the object MUST be
+ specified in the definition. If a parameter is available in
+ different types, each type SHOULD be registered separately.
+
+ General guidance for extension parameters is found in Appendix D.
+
+10.1. HTTP Authentication Scheme Registration
+
+ IANA has registered of the following scheme in the "HTTP
+ Authentication Schemes" registry [Auth-Schemes] defined in
+ Section 18.5 of [HTTP]:
+
+ Authentication Scheme Name: GNAP
+
+ Reference: Section 7.2 of RFC 9635
+
+10.2. Media Type Registration
+
+ Per this section, IANA has registered the following media types
+ [RFC2046] in the "Media Types" registry [MediaTypes] as described in
+ [RFC6838].
+
+10.2.1. application/gnap-binding-jwsd
+
+ This media type indicates that the content is a GNAP message to be
+ bound with a detached JWS mechanism.
+
+ Type name: application
+
+ Subtype name: gnap-binding-jwsd
+
+ Required parameters: N/A
+
+ Optional parameters: N/A
+
+ Encoding considerations: binary
+
+ Security considerations: See Section 11 of RFC 9635.
+
+ Interoperability considerations: N/A
+
+ Published specification: RFC 9635
+
+ Applications that use this media type: GNAP
+
+ Fragment identifier considerations: N/A
+
+ Additional information:
+
+ Deprecated alias names for this type: N/A
+ Magic number(s): N/A
+ File extension(s): N/A
+ Macintosh file type code(s): N/A
+
+ Person & email address to contact for further information: IETF GNAP
+ Working Group (txauth@ietf.org)
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author: IETF GNAP Working Group (txauth@ietf.org)
+
+ Change Controller: IETF
+
+10.2.2. application/gnap-binding-jws
+
+ This media type indicates that the content is a GNAP message to be
+ bound with an attached JWS mechanism.
+
+ Type name: application
+
+ Subtype name: gnap-binding-jws
+
+ Required parameters: N/A
+
+ Optional parameters: N/A
+
+ Encoding considerations: binary
+
+ Security considerations: See Section 11 of RFC 9635.
+
+ Interoperability considerations: N/A
+
+ Published specification: RFC 9635
+
+ Applications that use this media type: GNAP
+
+ Fragment identifier considerations: N/A
+
+ Additional information:
+
+ Deprecated alias names for this type: N/A
+ Magic number(s): N/A
+ File extension(s): N/A
+ Macintosh file type code(s): N/A
+
+ Person & email address to contact for further information: IETF GNAP
+ Working Group (txauth@ietf.org)
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author: IETF GNAP Working Group (txauth@ietf.org)
+
+ Change Controller: IETF
+
+10.2.3. application/gnap-binding-rotation-jwsd
+
+ This media type indicates that the content is a GNAP token rotation
+ message to be bound with a detached JWS mechanism.
+
+ Type name: application
+
+ Subtype name: gnap-binding-rotation-jwsd
+
+ Required parameters: N/A
+
+ Optional parameters: N/A
+
+ Encoding considerations: binary
+
+ Security considerations: See Section 11 of RFC 9635.
+
+ Interoperability considerations: N/A
+
+ Published specification: RFC 9635
+
+ Applications that use this media type: GNAP
+
+ Fragment identifier considerations: N/A
+
+ Additional information:
+
+ Deprecated alias names for this type: N/A
+ Magic number(s): N/A
+ File extension(s): N/A
+ Macintosh file type code(s): N/A
+
+ Person & email address to contact for further information: IETF GNAP
+ Working Group (txauth@ietf.org)
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author: IETF GNAP Working Group (txauth@ietf.org)
+
+ Change Controller: IETF
+
+10.2.4. application/gnap-binding-rotation-jws
+
+ This media type indicates that the content is a GNAP token rotation
+ message to be bound with an attached JWS mechanism.
+
+ Type name: application
+
+ Subtype name: gnap-binding-rotation-jws
+
+ Required parameters: N/A
+
+ Optional parameters: N/A
+
+ Encoding considerations: binary
+
+ Security considerations: See Section 11 of RFC 9635.
+
+ Interoperability considerations: N/A
+
+ Published specification: RFC 9635
+
+ Applications that use this media type: GNAP
+
+ Fragment identifier considerations: N/A
+
+ Additional information:
+
+ Deprecated alias names for this type: N/A
+ Magic number(s): N/A
+ File extension(s): N/A
+ Macintosh file type code(s): N/A
+
+ Person & email address to contact for further information: IETF GNAP
+ Working Group (txauth@ietf.org)
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author: IETF GNAP Working Group (txauth@ietf.org)
+
+ Change Controller: IETF
+
+10.3. GNAP Grant Request Parameters
+
+ This document defines a GNAP grant request, for which IANA has
+ created and maintains a new registry titled "GNAP Grant Request
+ Parameters". Initial values for this registry are given in
+ Section 10.3.2. Future assignments and modifications to existing
+ assignments are to be made through the Specification Required
+ registration policy [RFC8126].
+
+ The designated expert (DE) is expected to ensure the following:
+
+ * All registrations follow the template presented in Section 10.3.1.
+
+ * The request parameter's definition is sufficiently orthogonal to
+ existing functionality provided by existing parameters.
+
+ * Registrations for the same name with different types are
+ sufficiently close in functionality so as not to cause confusion
+ for developers.
+
+ * The request parameter's definition specifies the expected behavior
+ of the AS in response to the request parameter for each potential
+ state of the grant request.
+
+10.3.1. Registration Template
+
+ Name:
+ An identifier for the parameter.
+
+ Type:
+ The JSON type allowed for the value.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.3.2. Initial Contents
+
+ +==============+==================+===========================+
+ | Name | Type | Reference |
+ +==============+==================+===========================+
+ | access_token | object | Section 2.1.1 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | access_token | array of objects | Section 2.1.2 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | subject | object | Section 2.2 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | client | object | Section 2.3 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | client | string | Section 2.3.1 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | user | object | Section 2.4 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | user | string | Section 2.4.1 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | interact | object | Section 2.5 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | interact_ref | string | Section 5.1 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+
+ Table 1
+
+10.4. GNAP Access Token Flags
+
+ This document defines GNAP access token flags, for which IANA has
+ created and maintains a new registry titled "GNAP Access Token
+ Flags". Initial values for this registry are given in
+ Section 10.4.2. Future assignments and modifications to existing
+ assignments are to be made through the Specification Required
+ registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in Section 10.4.1.
+
+ * The flag specifies whether it applies to requests for tokens to
+ the AS, responses with tokens from the AS, or both.
+
+10.4.1. Registration Template
+
+ Name:
+ An identifier for the parameter.
+
+ Allowed Use:
+ Where the flag is allowed to occur. Possible values are
+ "Request", "Response", and "Request, Response".
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.4.2. Initial Contents
+
+ +=========+===================+====================+
+ | Name | Allowed Use | Reference |
+ +=========+===================+====================+
+ | bearer | Request, Response | Sections 2.1.1 and |
+ | | | 3.2.1 of RFC 9635 |
+ +---------+-------------------+--------------------+
+ | durable | Response | Section 3.2.1 of |
+ | | | RFC 9635 |
+ +---------+-------------------+--------------------+
+
+ Table 2
+
+10.5. GNAP Subject Information Request Fields
+
+ This document defines a means to request subject information from the
+ AS to the client instance, for which IANA has created and maintains a
+ new registry titled "GNAP Subject Information Request Fields".
+ Initial values for this registry are given in Section 10.5.2. Future
+ assignments and modifications to existing assignments are to be made
+ through the Specification Required registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in Section 10.5.1.
+
+ * Registrations for the same name with different types are
+ sufficiently close in functionality so as not to cause confusion
+ for developers.
+
+10.5.1. Registration Template
+
+ Name:
+ An identifier for the parameter.
+
+ Type:
+ The JSON type allowed for the value.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.5.2. Initial Contents
+
+ +===================+==================+=========================+
+ | Name | Type | Reference |
+ +===================+==================+=========================+
+ | sub_id_formats | array of strings | Section 2.2 of RFC 9635 |
+ +-------------------+------------------+-------------------------+
+ | assertion_formats | array of strings | Section 2.2 of RFC 9635 |
+ +-------------------+------------------+-------------------------+
+ | sub_ids | array of objects | Section 2.2 of RFC 9635 |
+ +-------------------+------------------+-------------------------+
+
+ Table 3
+
+10.6. GNAP Assertion Formats
+
+ This document defines a means to pass identity assertions between the
+ AS and client instance, for which IANA has created and maintains a
+ new registry titled "GNAP Assertion Formats". Initial values for
+ this registry are given in Section 10.6.2. Future assignments and
+ modifications to existing assignments are to be made through the
+ Specification Required registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in Section 10.6.1.
+
+ * The definition specifies the serialization format of the assertion
+ value as used within GNAP.
+
+10.6.1. Registration Template
+
+ Name:
+ An identifier for the assertion format.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.6.2. Initial Contents
+
+ +==========+===========================+
+ | Name | Reference |
+ +==========+===========================+
+ | id_token | Section 3.4.1 of RFC 9635 |
+ +----------+---------------------------+
+ | saml2 | Section 3.4.1 of RFC 9635 |
+ +----------+---------------------------+
+
+ Table 4
+
+10.7. GNAP Client Instance Fields
+
+ This document defines a means to send information about the client
+ instance, for which IANA has created and maintains a new registry
+ titled "GNAP Client Instance Fields". Initial values for this
+ registry are given in Section 10.7.2. Future assignments and
+ modifications to existing assignments are to be made through the
+ Specification Required registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in Section 10.7.1.
+
+ * Registrations for the same name with different types are
+ sufficiently close in functionality so as not to cause confusion
+ for developers.
+
+10.7.1. Registration Template
+
+ Name:
+ An identifier for the parameter.
+
+ Type:
+ The JSON type allowed for the value.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.7.2. Initial Contents
+
+ +==========+========+===========================+
+ | Name | Type | Reference |
+ +==========+========+===========================+
+ | key | object | Section 7.1 of RFC 9635 |
+ +----------+--------+---------------------------+
+ | key | string | Section 7.1.1 of RFC 9635 |
+ +----------+--------+---------------------------+
+ | class_id | string | Section 2.3 of RFC 9635 |
+ +----------+--------+---------------------------+
+ | display | object | Section 2.3.2 of RFC 9635 |
+ +----------+--------+---------------------------+
+
+ Table 5
+
+10.8. GNAP Client Instance Display Fields
+
+ This document defines a means to send end-user-facing displayable
+ information about the client instance, for which IANA has created and
+ maintains a new registry titled "GNAP Client Instance Display
+ Fields". Initial values for this registry are given in
+ Section 10.8.2. Future assignments and modifications to existing
+ assignments are to be made through the Specification Required
+ registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in Section 10.8.1.
+
+ * Registrations for the same name with different types are
+ sufficiently close in functionality so as not to cause confusion
+ for developers.
+
+10.8.1. Registration Template
+
+ Name:
+ An identifier for the parameter.
+
+ Type:
+ The JSON type allowed for the value.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.8.2. Initial Contents
+
+ +==========+========+===========================+
+ | Name | Type | Reference |
+ +==========+========+===========================+
+ | name | string | Section 2.3.2 of RFC 9635 |
+ +----------+--------+---------------------------+
+ | uri | string | Section 2.3.2 of RFC 9635 |
+ +----------+--------+---------------------------+
+ | logo_uri | string | Section 2.3.2 of RFC 9635 |
+ +----------+--------+---------------------------+
+
+ Table 6
+
+10.9. GNAP Interaction Start Modes
+
+ This document defines a means for the client instance to begin
+ interaction between the end user and the AS, for which IANA has
+ created and maintains a new registry titled "GNAP Interaction Start
+ Modes". Initial values for this registry are given in
+ Section 10.9.2. Future assignments and modifications to existing
+ assignments are to be made through the Specification Required
+ registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in Section 10.9.1.
+
+ * Registrations for the same name with different types are
+ sufficiently close in functionality so as not to cause confusion
+ for developers.
+
+ * Any registration using an "object" type declares all additional
+ parameters, their optionality, and their purpose.
+
+ * The start mode clearly defines what actions the client is expected
+ to take to begin interaction, what the expected user experience
+ is, and any security considerations for this communication from
+ either party.
+
+ * The start mode documents incompatibilities with other start modes
+ or finish methods, if applicable.
+
+ * The start mode provides enough information to uniquely identify
+ the grant request during the interaction. For example, in the
+ redirect and app modes, this is done using a unique URI (including
+ its parameters). In the user_code and user_code_uri modes, this
+ is done using the value of the user code.
+
+10.9.1. Registration Template
+
+ Mode:
+ An identifier for the interaction start mode.
+
+ Type:
+ The JSON type for the value, either "string" or "object", as
+ described in Section 2.5.1.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.9.2. Initial Contents
+
+ +===============+========+=============================+
+ | Mode | Type | Reference |
+ +===============+========+=============================+
+ | redirect | string | Section 2.5.1.1 of RFC 9635 |
+ +---------------+--------+-----------------------------+
+ | app | string | Section 2.5.1.2 of RFC 9635 |
+ +---------------+--------+-----------------------------+
+ | user_code | string | Section 2.5.1.3 of RFC 9635 |
+ +---------------+--------+-----------------------------+
+ | user_code_uri | string | Section 2.5.1.4 of RFC 9635 |
+ +---------------+--------+-----------------------------+
+
+ Table 7
+
+10.10. GNAP Interaction Finish Methods
+
+ This document defines a means for the client instance to be notified
+ of the end of interaction between the end user and the AS, for which
+ IANA has created and maintains a new registry titled "GNAP
+ Interaction Finish Methods". Initial values for this registry are
+ given in Section 10.10.2. Future assignments and modifications to
+ existing assignments are to be made through the Specification
+ Required registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in
+ Section 10.10.1.
+
+ * All finish methods clearly define what actions the AS is expected
+ to take, what listening methods the client instance needs to
+ enable, and any security considerations for this communication
+ from either party.
+
+ * All finish methods document incompatibilities with any start
+ modes, if applicable.
+
+10.10.1. Registration Template
+
+ Method:
+ An identifier for the interaction finish method.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.10.2. Initial Contents
+
+ +==========+=============================+
+ | Method | Reference |
+ +==========+=============================+
+ | redirect | Section 2.5.2.1 of RFC 9635 |
+ +----------+-----------------------------+
+ | push | Section 2.5.2.2 of RFC 9635 |
+ +----------+-----------------------------+
+
+ Table 8
+
+10.11. GNAP Interaction Hints
+
+ This document defines a set of hints that a client instance can
+ provide to the AS to facilitate interaction with the end user, for
+ which IANA has created and maintains a new registry titled "GNAP
+ Interaction Hints". Initial values for this registry are given in
+ Section 10.11.2. Future assignments and modifications to existing
+ assignments are to be made through the Specification Required
+ registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in
+ Section 10.11.1.
+
+ * All interaction hints clearly document the expected behaviors of
+ the AS in response to the hint, and an AS not processing the hint
+ does not impede the operation of the AS or client instance.
+
+10.11.1. Registration Template
+
+ Name:
+ An identifier for the parameter.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.11.2. Initial Contents
+
+ +============+===========================+
+ | Name | Reference |
+ +============+===========================+
+ | ui_locales | Section 2.5.3 of RFC 9635 |
+ +------------+---------------------------+
+
+ Table 9
+
+10.12. GNAP Grant Response Parameters
+
+ This document defines a GNAP grant response, for which IANA has
+ created and maintains a new registry titled "GNAP Grant Response
+ Parameters". Initial values for this registry are given in
+ Section 10.12.2. Future assignments and modifications to existing
+ assignments are to be made through the Specification Required
+ registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in
+ Section 10.12.1.
+
+ * The response parameter's definition is sufficiently orthogonal to
+ existing functionality provided by existing parameters.
+
+ * Registrations for the same name with different types are
+ sufficiently close in functionality so as not to cause confusion
+ for developers.
+
+ * The response parameter's definition specifies grant states for
+ which the client instance can expect this parameter to appear in a
+ response message.
+
+10.12.1. Registration Template
+
+ Name:
+ An identifier for the parameter.
+
+ Type:
+ The JSON type allowed for the value.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.12.2. Initial Contents
+
+ +==============+==================+===========================+
+ | Name | Type | Reference |
+ +==============+==================+===========================+
+ | continue | object | Section 3.1 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | access_token | object | Section 3.2.1 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | access_token | array of objects | Section 3.2.2 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | interact | object | Section 3.3 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | subject | object | Section 3.4 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | instance_id | string | Section 3.5 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+ | error | object | Section 3.6 of RFC 9635 |
+ +--------------+------------------+---------------------------+
+
+ Table 10
+
+10.13. GNAP Interaction Mode Responses
+
+ This document defines a means for the AS to provide the client
+ instance with information that is required to complete a particular
+ interaction mode, for which IANA has created and maintains a new
+ registry titled "GNAP Interaction Mode Responses". Initial values
+ for this registry are given in Section 10.13.2. Future assignments
+ and modifications to existing assignments are to be made through the
+ Specification Required registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in
+ Section 10.13.1.
+
+ * If the name of the registration matches the name of an interaction
+ start mode, the response parameter is unambiguously associated
+ with the interaction start mode of the same name.
+
+10.13.1. Registration Template
+
+ Name:
+ An identifier for the parameter.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.13.2. Initial Contents
+
+ +===============+=========================+
+ | Name | Reference |
+ +===============+=========================+
+ | redirect | Section 3.3 of RFC 9635 |
+ +---------------+-------------------------+
+ | app | Section 3.3 of RFC 9635 |
+ +---------------+-------------------------+
+ | user_code | Section 3.3 of RFC 9635 |
+ +---------------+-------------------------+
+ | user_code_uri | Section 3.3 of RFC 9635 |
+ +---------------+-------------------------+
+ | finish | Section 3.3 of RFC 9635 |
+ +---------------+-------------------------+
+ | expires_in | Section 3.3 of RFC 9635 |
+ +---------------+-------------------------+
+
+ Table 11
+
+10.14. GNAP Subject Information Response Fields
+
+ This document defines a means to return subject information from the
+ AS to the client instance, for which IANA has created and maintains a
+ new registry titled "GNAP Subject Information Response Fields".
+ Initial values for this registry are given in Section 10.14.2.
+ Future assignments and modifications to existing assignments are to
+ be made through the Specification Required registration policy
+ [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in
+ Section 10.14.1.
+
+ * Registrations for the same name with different types are
+ sufficiently close in functionality so as not to cause confusion
+ for developers.
+
+10.14.1. Registration Template
+
+ Name:
+ An identifier for the parameter.
+
+ Type:
+ The JSON type allowed for the value.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.14.2. Initial Contents
+
+ +============+==================+=========================+
+ | Name | Type | Reference |
+ +============+==================+=========================+
+ | sub_ids | array of objects | Section 3.4 of RFC 9635 |
+ +------------+------------------+-------------------------+
+ | assertions | array of objects | Section 3.4 of RFC 9635 |
+ +------------+------------------+-------------------------+
+ | updated_at | string | Section 3.4 of RFC 9635 |
+ +------------+------------------+-------------------------+
+
+ Table 12
+
+10.15. GNAP Error Codes
+
+ This document defines a set of errors that the AS can return to the
+ client instance, for which IANA has created and maintains a new
+ registry titled "GNAP Error Codes". Initial values for this registry
+ are given in Section 10.15.2. Future assignments and modifications
+ to existing assignments are to be made through the Specification
+ Required registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in
+ Section 10.15.1.
+
+ * The error response is sufficiently unique from other errors to
+ provide actionable information to the client instance.
+
+ * The definition of the error response specifies all conditions in
+ which the error response is returned and the client instance's
+ expected action.
+
+10.15.1. Registration Template
+
+ Error:
+ A unique string code for the error.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.15.2. Initial Contents
+
+ +============================+=========================+
+ | Error | Reference |
+ +============================+=========================+
+ | invalid_request | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | invalid_client | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | invalid_interaction | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | invalid_flag | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | invalid_rotation | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | key_rotation_not_supported | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | invalid_continuation | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | user_denied | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | request_denied | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | unknown_user | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | unknown_interaction | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | too_fast | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+ | too_many_attempts | Section 3.6 of RFC 9635 |
+ +----------------------------+-------------------------+
+
+ Table 13
+
+10.16. GNAP Key Proofing Methods
+
+ This document defines methods that the client instance can use to
+ prove possession of a key, for which IANA has created and maintains a
+ new registry titled "GNAP Key Proofing Methods". Initial values for
+ this registry are given in Section 10.16.2. Future assignments and
+ modifications to existing assignments are to be made through the
+ Specification Required registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in
+ Section 10.16.1.
+
+ * Registrations for the same name with different types are
+ sufficiently close in functionality so as not to cause confusion
+ for developers.
+
+ * The proofing method provides sufficient coverage of and binding to
+ the protocol messages to which it is applied.
+
+ * The proofing method definition clearly enumerates how all
+ requirements in Section 7.3 are fulfilled by the definition.
+
+10.16.1. Registration Template
+
+ Method:
+ A unique string code for the key proofing method.
+
+ Type:
+ The JSON type allowed for the value.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.16.2. Initial Contents
+
+ +=========+========+===========================+
+ | Method | Type | Reference |
+ +=========+========+===========================+
+ | httpsig | string | Section 7.3.1 of RFC 9635 |
+ +---------+--------+---------------------------+
+ | httpsig | object | Section 7.3.1 of RFC 9635 |
+ +---------+--------+---------------------------+
+ | mtls | string | Section 7.3.2 of RFC 9635 |
+ +---------+--------+---------------------------+
+ | jwsd | string | Section 7.3.3 of RFC 9635 |
+ +---------+--------+---------------------------+
+ | jws | string | Section 7.3.4 of RFC 9635 |
+ +---------+--------+---------------------------+
+
+ Table 14
+
+10.17. GNAP Key Formats
+
+ This document defines formats for a public key value, for which IANA
+ has created and maintains a new registry titled "GNAP Key Formats".
+ Initial values for this registry are given in Section 10.17.2.
+ Future assignments and modifications to existing assignments are to
+ be made through the Specification Required registration policy
+ [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in
+ Section 10.17.1.
+
+ * The key format specifies the structure and serialization of the
+ key material.
+
+10.17.1. Registration Template
+
+ Format:
+ A unique string code for the key format.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.17.2. Initial Contents
+
+ +===========+=========================+
+ | Format | Reference |
+ +===========+=========================+
+ | jwk | Section 7.1 of RFC 9635 |
+ +-----------+-------------------------+
+ | cert | Section 7.1 of RFC 9635 |
+ +-----------+-------------------------+
+ | cert#S256 | Section 7.1 of RFC 9635 |
+ +-----------+-------------------------+
+
+ Table 15
+
+10.18. GNAP Authorization Server Discovery Fields
+
+ This document defines a discovery document for an AS, for which IANA
+ has created and maintains a new registry titled "GNAP Authorization
+ Server Discovery Fields". Initial values for this registry are given
+ in Section 10.18.2. Future assignments and modifications to existing
+ assignments are to be made through the Specification Required
+ registration policy [RFC8126].
+
+ The DE is expected to ensure the following:
+
+ * All registrations follow the template presented in
+ Section 10.18.1.
+
+ * Registrations for the same name with different types are
+ sufficiently close in functionality so as not to cause confusion
+ for developers.
+
+ * The values in the discovery document are sufficient to provide
+ optimization and hints to the client instance, but knowledge of
+ the discovered value is not required for starting a transaction
+ with the AS.
+
+10.18.1. Registration Template
+
+ Name:
+ An identifier for the parameter.
+
+ Type:
+ The JSON type allowed for the value.
+
+ Reference:
+ Reference to one or more documents that specify the value,
+ preferably including a URI that can be used to retrieve a copy of
+ the document(s). An indication of the relevant sections may also
+ be included but is not required.
+
+10.18.2. Initial Contents
+
+ +======================================+==========+=============+
+ | Name | Type | Reference |
+ +======================================+==========+=============+
+ | grant_request_endpoint | string | Section 9 |
+ | | | of RFC 9635 |
+ +--------------------------------------+----------+-------------+
+ | interaction_start_modes_supported | array of | Section 9 |
+ | | strings | of RFC 9635 |
+ +--------------------------------------+----------+-------------+
+ | interaction_finish_methods_supported | array of | Section 9 |
+ | | strings | of RFC 9635 |
+ +--------------------------------------+----------+-------------+
+ | key_proofs_supported | array of | Section 9 |
+ | | strings | of RFC 9635 |
+ +--------------------------------------+----------+-------------+
+ | sub_id_formats_supported | array of | Section 9 |
+ | | strings | of RFC 9635 |
+ +--------------------------------------+----------+-------------+
+ | assertion_formats_supported | array of | Section 9 |
+ | | strings | of RFC 9635 |
+ +--------------------------------------+----------+-------------+
+ | key_rotation_supported | boolean | Section 9 |
+ | | | of RFC 9635 |
+ +--------------------------------------+----------+-------------+
+
+ Table 16
+
+11. Security Considerations
+
+ In addition to the normative requirements in this document,
+ implementors are strongly encouraged to consider these additional
+ security considerations in implementations and deployments of GNAP.
+
+11.1. TLS Protection in Transit
+
+ All requests in GNAP made over untrusted network connections have to
+ be made over TLS as outlined in [BCP195] to protect the contents of
+ the request and response from manipulation and interception by an
+ attacker. This includes all requests from a client instance to the
+ AS, all requests from the client instance to an RS, and any requests
+ back to a client instance such as the push-based interaction finish
+ method. Additionally, all requests between a browser and other
+ components, such as during redirect-based interaction, need to be
+ made over TLS or use equivalent protection such as a network
+ connection local to the browser ("localhost").
+
+ Even though requests from the client instance to the AS are signed,
+ the signature method alone does not protect the request from
+ interception by an attacker. TLS protects the response as well as
+ the request, preventing an attacker from intercepting requested
+ information as it is returned. This is particularly important in
+ this specification for security artifacts such as nonces and for
+ personal information such as subject information.
+
+ The use of key-bound access tokens does not negate the requirement
+ for protecting calls to the RS with TLS. The keys and signatures
+ associated with a bound access token will prevent an attacker from
+ using a stolen token; however, without TLS, an attacker would be able
+ to watch the data being sent to the RS and returned from the RS
+ during legitimate use of the client instance under attack.
+ Additionally, without TLS, an attacker would be able to profile the
+ calls made between the client instance and RS, possibly gaining
+ information about the functioning of the API between the client
+ software and RS software that would otherwise be unknown to the
+ attacker.
+
+ Note that connections from the end user and RO's browser also need to
+ be protected with TLS. This applies during initial redirects to an
+ AS's components during interaction, during any interaction with the
+ RO, and during any redirect back to the client instance. Without TLS
+ protection on these portions of the process, an attacker could wait
+ for a valid request to start and then take over the RO's interaction
+ session.
+
+11.2. Signing Requests from the Client Software
+
+ Even though all requests in GNAP need to be transmitted over TLS or
+ its equivalent, the use of TLS alone is not sufficient to protect all
+ parts of a multi-party and multi-stage protocol like GNAP, and TLS is
+ not targeted at tying multiple requests to each other over time. To
+ account for this, GNAP makes use of message-level protection and key
+ presentation mechanisms that strongly associate a request with a key
+ held by the client instance (see Section 7).
+
+ During the initial request from a client instance to the AS, the
+ client instance has to identify and prove possession of a
+ cryptographic key. If the key is known to the AS, e.g., previously
+ registered or dereferenceable to a trusted source, the AS can
+ associate a set of policies to the client instance identified by the
+ key. Without the requirement that the client instance prove that it
+ holds that key, the AS could not trust that the connection came from
+ any particular client and could not apply any associated policies.
+
+ Even more importantly, the client instance proving possession of a
+ key on the first request allows the AS to associate future requests
+ with each other by binding all future requests in that transaction to
+ the same key. The access token used for grant continuation is bound
+ to the same key and proofing mechanism used by the client instance in
+ its initial request; this means that the client instance needs to
+ prove possession of that same key in future requests, which allows
+ the AS to be sure that the same client instance is executing the
+ follow-ups for a given ongoing grant request. Therefore, the AS has
+ to ensure that all subsequent requests for a grant are associated
+ with the same key that started the grant or with the most recent
+ rotation of that key. This need holds true even if the initial key
+ is previously unknown to the AS, such as would be the case when a
+ client instance creates an ephemeral key for its request. Without
+ this ongoing association, an attacker would be able to impersonate a
+ client instance in the midst of a grant request, potentially stealing
+ access tokens and subject information with impunity.
+
+ Additionally, all access tokens in GNAP default to be associated with
+ the key that was presented during the grant request that created the
+ access token. This association allows an RS to know that the
+ presenter of the access token is the same party that the token was
+ issued to, as identified by their keys. While non-bound bearer
+ tokens are an option in GNAP, these types of tokens have their own
+ trade-offs, which are discussed in Section 11.9.
+
+ TLS functions at the transport layer, ensuring that only the parties
+ on either end of that connection can read the information passed
+ along that connection. Each time a new connection is made, such as
+ for a new HTTP request, a new trust that is mostly unrelated to
+ previous connections is re-established. While modern TLS does make
+ use of session resumption, this still needs to be augmented with
+ authentication methods to determine the identity of parties on the
+ connections. In other words, it is not possible with TLS alone to
+ know that the same party is making a set of calls over time, since
+ each time a new TLS connection is established, both the client and
+ the server (or the server only when using MTLS (Section 7.3.2)) have
+ to validate the other party's identity. Such a verification can be
+ achieved via methods described in [RFC9525], but these are not enough
+ to establish the identity of the client instance in many cases.
+
+ To counter this, GNAP defines a set of key binding methods in
+ Section 7.3 that allows authentication and proof of possession by the
+ caller, which is usually the client instance. These methods are
+ intended to be used in addition to TLS on all connections.
+
+11.3. MTLS Message Integrity
+
+ The MTLS key proofing mechanism (Section 7.3.2) provides a means for
+ a client instance to present a key using a certificate at the TLS
+ layer. Since TLS protects the entire HTTP message in transit,
+ verification of the TLS client certificate presented with the message
+ provides a sufficient binding between the two. However, since TLS is
+ functioning at a separate layer from HTTP, there is no direct
+ connection between the TLS key presentation and the message itself,
+ other than the fact that the message was presented over the TLS
+ channel. That is to say, any HTTP message can be presented over the
+ TLS channel in question with the same level of trust. The verifier
+ is responsible for ensuring the key in the TLS client certificate is
+ the one expected for a particular request. For example, if the
+ request is a grant request (Section 2), the AS needs to compare the
+ TLS client certificate presented at the TLS layer to the key
+ identified in the request content itself (either by value or through
+ a referenced identifier).
+
+ Furthermore, the prevalence of the TLS terminating reverse proxy
+ (TTRP) pattern in deployments adds a wrinkle to the situation. In
+ this common pattern, the TTRP validates the TLS connection and then
+ forwards the HTTP message contents onward to an internal system for
+ processing. The system processing the HTTP message no longer has
+ access to the original TLS connection's information and context. To
+ compensate for this, the TTRP could inject the TLS client certificate
+ into the forwarded request using the HTTP Client-Cert header field
+ [RFC9111], giving the downstream system access to the certificate
+ information. The TTRP has to be trusted to provide accurate
+ certificate information, and the connection between the TTRP and the
+ downstream system also has to be protected. The TTRP could provide
+ some additional assurance, for example, by adding its own signature
+ to the Client-Cert header field using HTTP message signatures
+ [RFC9421]. This signature would be effectively ignored by GNAP
+ (since it would not use GNAP's tag parameter value) but would be
+ understood by the downstream service as part of its deployment.
+
+ Additional considerations for different types of deployment patterns
+ and key distribution mechanisms for MTLS are found in Section 11.4.
+
+11.4. MTLS Deployment Patterns
+
+ GNAP does not specify how a client instance's keys could be made
+ known to the AS ahead of time. The Public Key Infrastructure (PKI)
+ can be used to manage the keys used by client instances when calling
+ the AS, allowing the AS to trust a root key from a trusted authority.
+ This method is particularly relevant to the MTLS key proofing method,
+ where the client instance presents its certificate to the AS as part
+ of the TLS connection. An AS using PKI to validate the MTLS
+ connection would need to ensure that the presented certificate was
+ issued by a trusted certificate authority before allowing the
+ connection to continue. PKI-based certificates would allow a key to
+ be revoked and rotated through management at the certificate
+ authority without requiring additional registration or management at
+ the AS. The PKI required to manage mutually authenticated TLS has
+ historically been difficult to deploy, especially at scale, but it
+ remains an appropriate solution for systems where the required
+ management overhead is not an impediment.
+
+ MTLS in GNAP need not use a PKI backing, as self-signed certificates
+ and certificates from untrusted authorities can still be presented as
+ part of a TLS connection. In this case, the verifier would validate
+ the connection but accept whatever certificate was presented by the
+ client software. This specific certificate can then be bound to all
+ future connections from that client software by being bound to the
+ resulting access tokens, in a trust-on-first-use pattern. See
+ Section 11.3 for more considerations on MTLS as a key proofing
+ mechanism.
+
+11.5. Protection of Client Instance Key Material
+
+ Client instances are identified by their unique keys, and anyone with
+ access to a client instance's key material will be able to
+ impersonate that client instance to all parties. This is true for
+ both calls to the AS as well as calls to an RS using an access token
+ bound to the client instance's unique key. As a consequence, it is
+ of utmost importance for a client instance to protect its private key
+ material.
+
+ Different types of client software have different methods for
+ creating, managing, and registering keys. GNAP explicitly allows for
+ ephemeral clients such as single-page applications (SPAs) and single-
+ user clients (such as mobile applications) to create and present
+ their own keys during the initial grant request without any explicit
+ pre-registration step. The client software can securely generate a
+ key pair on the device and present the public key, along with proof
+ of holding the associated private key, to the AS as part of the
+ initial request. To facilitate trust in these ephemeral keys, GNAP
+ further allows for an extensible set of client information to be
+ passed with the request. This information can include device posture
+ and third-party attestations of the client software's provenance and
+ authenticity, depending on the needs and capabilities of the client
+ software and its deployment.
+
+ From GNAP's perspective, each distinct key is a different client
+ instance. However, multiple client instances can be grouped together
+ by an AS policy and treated similarly to each other. For instance,
+ if an AS knows of several different keys for different servers within
+ a cluster, the AS can decide that authorization of one of these
+ servers applies to all other servers within the cluster. An AS that
+ chooses to do this needs to be careful with how it groups different
+ client keys together in its policy, since the breach of one instance
+ would have direct effects on the others in the cluster.
+
+ Additionally, if an end user controls multiple instances of a single
+ type of client software, such as having an application installed on
+ multiple devices, each of these instances is expected to have a
+ separate key and be issued separate access tokens. However, if the
+ AS is able to group these separate instances together as described
+ above, it can streamline the authorization process for new instances
+ of the same client software. For example, if two client instances
+ can present proof of a valid installation of a piece of client
+ software, the AS would be able to associate the approval of the first
+ instance of this software to all related instances. The AS could
+ then choose to bypass an explicit prompt of the RO for approval
+ during authorization, since such approval has already been given. An
+ AS doing such a process would need to take assurance measures that
+ the different instances are in fact correlated and authentic, as well
+ as ensure that the expected RO is in control of the client instance.
+
+ Finally, if multiple instances of client software each have the same
+ key, then from GNAP's perspective, these are functionally the same
+ client instance as GNAP has no reasonable way to differentiate
+ between them. This situation could happen if multiple instances
+ within a cluster can securely share secret information among
+ themselves. Even though there are multiple copies of the software,
+ the shared key makes these copies all present as a single instance.
+ It is considered bad practice to share keys between copies of
+ software unless they are very tightly integrated with each other and
+ can be closely managed. It is particularly bad practice to allow an
+ end user to copy keys between client instances and to willingly use
+ the same key in multiple instances.
+
+11.6. Protection of Authorization Server
+
+ The AS performs critical functions in GNAP, including authenticating
+ client software, managing interactions with end users to gather
+ consent and provide notice, and issuing access tokens for client
+ instances to present to RSs. As such, protecting the AS is central
+ to any GNAP deployment.
+
+ If an attacker is able to gain control over an AS, they would be able
+ to create fraudulent tokens and manipulate registration information
+ to allow for malicious clients. These tokens and clients would be
+ trusted by other components in the ecosystem under the protection of
+ the AS.
+
+ If the AS uses signed access tokens, an attacker in control of the
+ AS's signing keys would be able to manufacture fraudulent tokens for
+ use at RSs under the protection of the AS.
+
+ If an attacker is able to impersonate an AS, they would be able to
+ trick legitimate client instances into making signed requests for
+ information that could potentially be proxied to a real AS. To
+ combat this, all communications to the AS need to be made over TLS or
+ its equivalent, and the software making the connection has to
+ validate the certificate chain of the host it is connecting to.
+
+ Consequently, protecting, monitoring, and auditing the AS is
+ paramount to preserving the security of a GNAP-protected ecosystem.
+ The AS presents attackers with a valuable target for attack.
+ Fortunately, the core focus and function of the AS is to provide
+ security for the ecosystem, unlike the RS whose focus is to provide
+ an API or the client software whose focus is to access the API.
+
+11.7. Symmetric and Asymmetric Client Instance Keys
+
+ Many of the cryptographic methods used by GNAP for key proofing can
+ support both asymmetric and symmetric cryptography, and they can be
+ extended to use a wide variety of mechanisms. Implementors will find
+ the available guidelines on cryptographic key management provided in
+ [RFC4107] useful. While symmetric cryptographic systems have some
+ benefits in speed and simplicity, they have a distinct drawback --
+ both parties need access to the same key in order to do both signing
+ and verification of the message. When more than two parties share
+ the same symmetric key, data origin authentication is not provided.
+ Any party that knows the symmetric key can compute a valid MAC;
+ therefore, the contents could originate from any one of the parties.
+
+ Use of symmetric cryptography means that when the client instance
+ calls the AS to request a token, the AS needs to know the exact value
+ of the client instance's key (or be able to derive it) in order to
+ validate the key proof signature. With asymmetric keys, the client
+ needs to only send its public key to the AS to allow for verification
+ that the client holds the associated private key, regardless of
+ whether or not that key was pre-registered with the AS.
+
+ Symmetric keys also have the expected advantage of providing better
+ protection against quantum threats in the future. Also, these types
+ of keys (and their secure derivations) are widely supported among
+ many cloud-based key management systems.
+
+ When used to bind to an access token, a key value must be known by
+ the RS in order to validate the proof signature on the request.
+ Common methods for communicating these proofing keys include putting
+ information in a structured access token and allowing the RS to look
+ up the associated key material against the value of the access token.
+ With symmetric cryptography, both of these methods would expose the
+ signing key to the RS and, in the case of a structured access token,
+ potentially to any party that can see the access token itself unless
+ the token's payload has been encrypted. Any of these parties would
+ then be able to make calls using the access token by creating a valid
+ signature using the shared key. With asymmetric cryptography, the RS
+ needs to only know the public key associated with the token in order
+ to validate the request; therefore, the RS cannot create any new
+ signed calls.
+
+ While both signing approaches are allowed, GNAP treats these two
+ classes of keys somewhat differently. Only the public portion of
+ asymmetric keys are allowed to be sent by value in requests to the AS
+ when establishing a connection. Since sending a symmetric key (or
+ the private portion of an asymmetric key) would expose the signing
+ material to any parties on the request path, including any attackers,
+ sending these kinds of keys by value is prohibited. Symmetric keys
+ can still be used by client instances, but only if the client
+ instance can send a reference to the key and not its value. This
+ approach allows the AS to use pre-registered symmetric keys as well
+ as key derivation schemes to take advantage of symmetric cryptography
+ without requiring key distribution at runtime, which would expose the
+ keys in transit.
+
+ Both the AS and client software can use systems such as hardware
+ security modules to strengthen their key security storage and
+ generation for both asymmetric and symmetric keys (see also
+ Section 7.1.2).
+
+11.8. Generation of Access Tokens
+
+ The contents of access tokens need to be such that only the
+ generating AS would be able to create them, and the contents cannot
+ be manipulated by an attacker to gain different or additional access
+ rights.
+
+ One method for accomplishing this is to use a cryptographically
+ random value for the access token, generated by the AS using a secure
+ randomization function with sufficiently high entropy. The odds of
+ an attacker guessing the output of the randomization function to
+ collide with a valid access token are exceedingly small, and even
+ then, the attacker would not have any control over what the access
+ token would represent since that information would be held close by
+ the AS.
+
+ Another method for accomplishing this is to use a structured token
+ that is cryptographically signed. In this case, the payload of the
+ access token declares to the RS what the token is good for, but the
+ signature applied by the AS during token generation covers this
+ payload. Only the AS can create such a signature; therefore, only
+ the AS can create such a signed token. The odds of an attacker being
+ able to guess a signature value with a useful payload are exceedingly
+ small. This technique only works if all targeted RSs check the
+ signature of the access token. Any RS that does not validate the
+ signature of all presented tokens would be susceptible to injection
+ of a modified or falsified token. Furthermore, an AS has to
+ carefully protect the keys used to sign access tokens, since anyone
+ with access to these signing keys would be able to create seemingly
+ valid access tokens using them.
+
+11.9. Bearer Access Tokens
+
+ Bearer access tokens can be used by any party that has access to the
+ token itself, without any additional information. As a natural
+ consequence, any RS that a bearer token is presented to has the
+ technical capability of presenting that bearer token to another RS,
+ as long as the token is valid. It also means that any party that is
+ able to capture the token value in storage or in transit is able to
+ use the access token. While bearer tokens are inherently simpler,
+ this simplicity has been misapplied and abused in making needlessly
+ insecure systems. The downsides of bearer tokens have become more
+ pertinent lately as stronger authentication systems have caused some
+ attacks to shift to target tokens and APIs.
+
+ In GNAP, key-bound access tokens are the default due to their higher
+ security properties. While bearer tokens can be used in GNAP, their
+ use should be limited to cases where the simplicity benefits outweigh
+ the significant security downsides. One common deployment pattern is
+ to use a gateway that takes in key-bound tokens on the outside and
+ verifies the signatures on the incoming requests but translates the
+ requests to a bearer token for use by trusted internal systems. The
+ bearer tokens are never issued or available outside of the internal
+ systems, greatly limiting the exposure of the less-secure tokens but
+ allowing the internal deployment to benefit from the advantages of
+ bearer tokens.
+
+11.10. Key-Bound Access Tokens
+
+ Key-bound access tokens, as the name suggests, are bound to a
+ specific key and must be presented along with proof of that key
+ during use. The key itself is not presented at the same time as the
+ token, so even if a token value is captured, it cannot be used to
+ make a new request. This is particularly true for an RS, which will
+ see the token value but will not see the keys used to make the
+ request (assuming asymmetric cryptography is in use, see
+ Section 11.7).
+
+ Key-bound access tokens provide this additional layer of protection
+ only when the RS checks the signature of the message presented with
+ the token. Acceptance of an invalid presentation signature, or
+ failure to check the signature entirely, would allow an attacker to
+ make calls with a captured access token without having access to the
+ related signing key material.
+
+ In addition to validating the signature of the presentation message
+ itself, the RS also needs to ensure that the signing key used is
+ appropriate for the presented token. If an RS does not ensure that
+ the right keys were used to sign a message with a specific token, an
+ attacker would be able to capture an access token and sign the
+ request with their own keys, thereby negating the benefits of using
+ key-bound access tokens.
+
+ The RS also needs to ensure that sufficient portions of the message
+ are covered by the signature. Any items outside the signature could
+ still affect the API's processing decisions, but these items would
+ not be strongly bound to the token presentation. As such, an
+ attacker could capture a valid request and then manipulate portions
+ of the request outside of the signature envelope in order to cause
+ unwanted actions at the protected API.
+
+ Some key-bound tokens are susceptible to replay attacks, depending on
+ the details of the signing method used. Therefore, key proofing
+ mechanisms used with access tokens need to use replay-protection
+ mechanisms covered under the signature such as a per-message nonce, a
+ reasonably short time validity window, or other uniqueness
+ constraints. The details of using these will vary depending on the
+ key proofing mechanism in use. For example, HTTP message signatures
+ have both a created and nonce signature parameter as well as the
+ ability to cover significant portions of the HTTP message. All of
+ these can be used to limit the attack surface.
+
+11.11. Exposure of End-User Credentials to Client Instance
+
+ As a delegation protocol, one of the main goals of GNAP is to prevent
+ the client software from being exposed to any credentials or
+ information about the end user or RO as a requirement of the
+ delegation process. By using the variety of interaction mechanisms,
+ the RO can interact with the AS without ever authenticating to the
+ client software and without the client software having to impersonate
+ the RO through replay of their credentials.
+
+ Consequently, no interaction methods defined in this specification
+ require the end user to enter their credentials, but it is
+ technologically possible for an extension to be defined to carry such
+ values. Such an extension would be dangerous as it would allow rogue
+ client software to directly collect, store, and replay the end user's
+ credentials outside of any legitimate use within a GNAP request.
+
+ The concerns of such an extension could be mitigated through use of a
+ challenge and response unlocked by the end user's credentials. For
+ example, the AS presents a challenge as part of an interaction start
+ method, and the client instance signs that challenge using a key
+ derived from a password presented by the end user. It would be
+ possible for the client software to collect this password in a secure
+ software enclave without exposing the password to the rest of the
+ client software or putting it across the wire to the AS. The AS can
+ validate this challenge response against a known password for the
+ identified end user. While an approach such as this does not remove
+ all of the concerns surrounding such a password-based scheme, it is
+ at least possible to implement in a more secure fashion than simply
+ collecting and replaying the password. Even so, such schemes should
+ only ever be used by trusted clients due to the ease of abusing them.
+
+11.12. Mixing Up Authorization Servers
+
+ If a client instance is able to work with multiple ASes
+ simultaneously, it is possible for an attacker to add a compromised
+ AS to the client instance's configuration and cause the client
+ software to start a request at the compromised AS. This AS could
+ then proxy the client's request to a valid AS in order to attempt to
+ get the RO to approve access for the legitimate client instance.
+
+ A client instance needs to always be aware of which AS it is talking
+ to throughout a grant process and ensure that any callback for one AS
+ does not get conflated with the callback to different AS. The
+ interaction finish hash calculation in Section 4.2.3 allows a client
+ instance to protect against this kind of substitution, but only if
+ the client instance validates the hash. If the client instance does
+ not use an interaction finish method or does not check the
+ interaction finish hash value, the compromised AS can be granted a
+ valid access token on behalf of the RO. See Sections 4.5.5 and 5.5
+ of [AXELAND2021] for details of one such attack, which has been
+ addressed in this document by including the grant endpoint in the
+ interaction hash calculation. Note that the client instance still
+ needs to validate the hash for the attack to be prevented.
+
+11.13. Processing of Client-Presented User Information
+
+ GNAP allows the client instance to present assertions and identifiers
+ of the current user to the AS as part of the initial request. This
+ information should only ever be taken by the AS as a hint, since the
+ AS has no way to tell if the represented person is present at the
+ client software without using an interaction mechanism. This
+ information does not guarantee the given user is there, but it does
+ constitute a statement by the client software that the AS can take
+ into account.
+
+ For example, if a specific user is claimed to be present prior to
+ interaction, but a different user is shown to be present during
+ interaction, the AS can either determine this to be an error or
+ signal to the client instance through returned subject information
+ that the current user has changed from what the client instance
+ thought. This user information can also be used by the AS to
+ streamline the interaction process when the user is present. For
+ example, instead of having the user type in their account identifier
+ during interaction at a redirected URI, the AS can immediately
+ challenge the user for their account credentials. Alternatively, if
+ an existing session is detected, the AS can determine that it matches
+ the identifier provided by the client and subsequently skip an
+ explicit authentication event by the RO.
+
+ In cases where the AS trusts the client software more completely, due
+ to policy or previous approval of a given client instance, the AS can
+ take this user information as a statement that the user is present
+ and could issue access tokens and release subject information without
+ interaction. The AS should only take such action in very limited
+ circumstances, as a client instance could assert whatever it likes
+ for the user's identifiers in its request. The AS can limit the
+ possibility of this by issuing randomized opaque identifiers to
+ client instances to represent different end-user accounts after an
+ initial login.
+
+ When a client instance presents an assertion to the AS, the AS needs
+ to evaluate that assertion. Since the AS is unlikely to be the
+ intended audience of an assertion held by the client software, the AS
+ will need to evaluate the assertion in a different context. Even in
+ this case, the AS can still evaluate that the assertion was generated
+ by a trusted party, was appropriately signed, and is within any time
+ validity windows stated by the assertion. If the client instance's
+ audience identifier is known to the AS and can be associated with the
+ client instance's presented key, the AS can also evaluate that the
+ appropriate client instance is presenting the claimed assertion. All
+ of this will prevent an attacker from presenting a manufactured
+ assertion or one captured from an untrusted system. However, without
+ validating the audience of the assertion, a captured assertion could
+ be presented by the client instance to impersonate a given end user.
+ In such cases, the assertion offers little more protection than a
+ simple identifier would.
+
+ A special case exists where the AS is the generator of the assertion
+ being presented by the client instance. In these cases, the AS can
+ validate that it did issue the assertion and it is associated with
+ the client instance presenting the assertion.
+
+11.14. Client Instance Pre-registration
+
+ Each client instance is identified by its own unique key, and for
+ some kinds of client software such as a web server or backend system,
+ this identification can be facilitated by registering a single key
+ for a piece of client software ahead of time. This registration can
+ be associated with a set of display attributes to be used during the
+ authorization process to identify the client software to the user.
+ In these cases, it can be assumed that only one instance of client
+ software will exist, likely to serve many different users.
+
+ A client's registration record needs to include its identifying key.
+ Furthermore, it is the case that any clients using symmetric
+ cryptography for key proofing mechanisms need to have their keys pre-
+ registered. The registration should also include any information
+ that would aid in the authorization process, such as a display name
+ and logo. The registration record can also limit a given client to
+ ask for certain kinds of information or use specific interaction
+ mechanisms at runtime.
+
+ It also is sensible to pre-register client instances when the
+ software is acting autonomously, without the need for a runtime
+ approval by an RO or any interaction with an end user. In these
+ cases, an AS needs to rely on the trust decisions that have been
+ determined prior to runtime to determine what rights and tokens to
+ grant to a given client instance.
+
+ However, it does not make sense to pre-register many types of
+ clients. Single-page applications (SPAs) and mobile/desktop
+ applications in particular present problems with pre-registration.
+ For SPAs, the instances are ephemeral in nature, and long-term
+ registration of a single instance leads to significant storage and
+ management overhead at the AS. For mobile applications, each
+ installation of the client software is a separate instance, and
+ sharing a key among all instances would be detrimental to security as
+ the compromise of any single installation would compromise all copies
+ for all users.
+
+ An AS can treat these classes of client software differently from
+ each other, perhaps by allowing access to certain high-value APIs
+ only to pre-registered known clients or by requiring an active end-
+ user delegation of authority to any client software not pre-
+ registered.
+
+ An AS can also provide warnings and caveats to ROs during the
+ authorization process, allowing the user to make an informed decision
+ regarding the software they are authorizing. For example, if the AS
+ has vetted the client software and this specific instance, it can
+ present a different authorization screen compared to a client
+ instance that is presenting all of its information at runtime.
+
+ Finally, an AS can use platform attestations and other signals from
+ the client instance at runtime to determine whether or not the
+ software making the request is legitimate. The details of such
+ attestations are outside the scope of this specification, but the
+ client portion of a grant request provides a natural extension point
+ to such information through the "GNAP Client Instance Fields"
+ registry (Section 10.7).
+
+11.15. Client Instance Impersonation
+
+ If client instances are allowed to set their own user-facing display
+ information, such as a display name and website URL, a malicious
+ client instance could impersonate legitimate client software for the
+ purposes of tricking users into authorizing the malicious client.
+
+ Requiring clients to pre-register does not fully mitigate this
+ problem since many pre-registration systems have self-service portals
+ for management of client registration, allowing authenticated
+ developers to enter self-asserted information into the management
+ portal.
+
+ An AS can mitigate this by actively filtering all self-asserted
+ values presented by client software, both dynamically as part of GNAP
+ and through a registration portal, to limit the kinds of
+ impersonation that could be done.
+
+ An AS can also warn the RO about the provenance of the information it
+ is displaying, allowing the RO to make a more informed delegation
+ decision. For example, an AS can visually differentiate between a
+ client instance that can be traced back to a specific developer's
+ registration and an instance that has self-asserted its own display
+ information.
+
+11.16. Client-Hosted Logo URI
+
+ The logo_uri client display field defined in Section 2.3.2 allows the
+ client instance to specify a URI from which an image can be fetched
+ for display during authorization decisions. When the URI points to
+ an externally hosted resource (as opposed to a data: URI), the
+ logo_uri field presents challenges in addition to the considerations
+ in Section 11.15.
+
+ When a logo_uri is externally hosted, the client software (or the
+ host of the asset) can change the contents of the logo without
+ informing the AS. Since the logo is considered an aspect of the
+ client software's identity, this flexibility allows for a more
+ dynamically managed client instance that makes use of the distributed
+ systems.
+
+ However, this same flexibility allows the host of the asset to change
+ the hosted file in a malicious way, such as replacing the image
+ content with malicious software for download or imitating a different
+ piece of client software. Additionally, the act of fetching the URI
+ could accidentally leak information to the image host in the HTTP
+ Referer header field, if one is sent. Even though GNAP intentionally
+ does not include security parameters in front-channel URIs wherever
+ possible, the AS still should take steps to ensure that this
+ information does not leak accidentally, such as setting a referrer
+ policy on image links or displaying images only from pages served
+ from a URI with no sensitive security or identity information.
+
+ To avoid these issues, the AS can insist on the use of data: URIs,
+ though that might not be practical for all types of client software.
+ Alternatively, the AS could pre-fetch the content of the URI and
+ present its own copy to the RO instead. This practice opens the AS
+ to potential SSRF attacks, as discussed in Section 11.34.
+
+11.17. Interception of Information in the Browser
+
+ Most information passed through the web browser is susceptible to
+ interception and possible manipulation by elements within the browser
+ such as scripts loaded within pages. Information in the URI is
+ exposed through browser and server logs, and it can also leak to
+ other parties through HTTP Referer headers.
+
+ GNAP's design limits the information passed directly through the
+ browser, allowing for opaque URIs in most circumstances. For the
+ redirect-based interaction finish mechanism, named query parameters
+ are used to carry unguessable opaque values. For these, GNAP
+ requires creation and validation of a cryptographic hash to protect
+ the query parameters added to the URI and associate them with an
+ ongoing grant process and values not passed in the URI. The client
+ instance has to properly validate this hash to prevent an attacker
+ from injecting an interaction reference intended for a different AS
+ or client instance.
+
+ Several interaction start mechanisms use URIs created by the AS and
+ passed to the client instance. While these URIs are opaque to the
+ client instance, it's possible for the AS to include parameters,
+ paths, and other pieces of information that could leak security data
+ or be manipulated by a party in the middle of the transaction. An AS
+ implementation can avoid this problem by creating URIs using
+ unguessable values that are randomized for each new grant request.
+
+11.18. Callback URI Manipulation
+
+ The callback URI used in interaction finish mechanisms is defined by
+ the client instance. This URI is opaque to the AS but can contain
+ information relevant to the client instance's operations. In
+ particular, the client instance can include state information to
+ allow the callback request to be associated with an ongoing grant
+ request.
+
+ Since this URI is exposed to the end user's browser, it is
+ susceptible to both logging and manipulation in transit before the
+ request is made to the client software. As such, a client instance
+ should never put security-critical or private information into the
+ callback URI in a cleartext form. For example, if the client
+ software includes a post-redirect target URI in its callback URI to
+ the AS, this target URI could be manipulated by an attacker, creating
+ an open redirector at the client. Instead, a client instance can use
+ an unguessable identifier in the URI that can then be used by the
+ client software to look up the details of the pending request. Since
+ this approach requires some form of statefulness by the client
+ software during the redirection process, clients that are not capable
+ of holding state through a redirect should not use redirect-based
+ interaction mechanisms.
+
+11.19. Redirection Status Codes
+
+ As described in [OAUTH-SEC-TOPICS], a server should never use HTTP
+ status code 307 (Temporary Redirect) to redirect a request that
+ potentially contains user credentials. If an HTTP redirect is used
+ for such a request, HTTP status code 303 (See Other) should be used
+ instead.
+
+ Status code 307 (Temporary Redirect), as defined in the HTTP standard
+ [HTTP], requires the user agent to preserve the method and content of
+ a request, thus submitting the content of the POST request to the
+ redirect target. In the HTTP standard [HTTP], only status code 303
+ (See Other) unambiguously enforces rewriting the HTTP POST request to
+ an HTTP GET request, which eliminates the POST content from the
+ redirected request. For all other status codes, including status
+ code 302 (Found), user agents are allowed to keep a redirected POST
+ request as a POST and thus can resubmit the content.
+
+ The use of status code 307 (Temporary Redirect) results in a
+ vulnerability when using the redirect interaction finish method
+ (Section 3.3.5). With this method, the AS potentially prompts the RO
+ to enter their credentials in a form that is then submitted back to
+ the AS (using an HTTP POST request). The AS checks the credentials
+ and, if successful, may immediately redirect the RO to the client
+ instance's redirect URI. Due to the use of status code 307
+ (Temporary Redirect), the RO's user agent now transmits the RO's
+ credentials to the client instance. A malicious client instance can
+ then use the obtained credentials to impersonate the RO at the AS.
+
+ Redirection away from the initial URI in an interaction session could
+ also leak information found in that initial URI through the HTTP
+ Referer header field, which would be sent by the user agent to the
+ redirect target. To avoid such leakage, a server can first redirect
+ to an internal interstitial page without any identifying or sensitive
+ information on the URI before processing the request. When the user
+ agent is ultimately redirected from this page, no part of the
+ original interaction URI will be found in the Referer header.
+
+11.20. Interception of Responses from the AS
+
+ Responses from the AS contain information vital to both the security
+ and privacy operations of GNAP. This information includes nonces
+ used in cryptographic calculations, Subject Identifiers, assertions,
+ public keys, and information about what client software is requesting
+ and was granted.
+
+ In addition, if bearer tokens are used or keys are issued alongside a
+ bound access token, the response from the AS contains all information
+ necessary for use of the contained access token. Any party that is
+ capable of viewing such a response, such as an intermediary proxy,
+ would be able to exfiltrate and use this token. If the access token
+ is instead bound to the client instance's presented key,
+ intermediaries no longer have sufficient information to use the
+ token. They can still, however, gain information about the end user
+ as well as the actions of the client software.
+
+11.21. Key Distribution
+
+ GNAP does not define ways for the client instances keys to be
+ provided to the client instances, particularly in light of how those
+ keys are made known to the AS. These keys could be generated
+ dynamically on the client software or pre-registered at the AS in a
+ static developer portal. The keys for client instances could also be
+ distributed as part of the deployment process of instances of the
+ client software. For example, an application installation framework
+ could generate a key pair for each copy of client software and then
+ both install it into the client software upon installation and
+ register that instance with the AS.
+
+ Alternatively, it's possible for the AS to generate keys to be used
+ with access tokens that are separate from the keys used by the client
+ instance to request tokens. In this method, the AS would generate
+ the asymmetric key pair or symmetric key and return the public key or
+ key reference to the client instance alongside the access token
+ itself. The means for the AS to return generated key values to the
+ client instance are out of scope, since GNAP does not allow the
+ transmission of private or shared key information within the protocol
+ itself.
+
+ Additionally, if the token is bound to a key other than the client
+ instance's presented key, this opens a possible attack surface for an
+ attacker's AS to request an access token and then substitute their
+ own key material in the response to the client instance. The
+ attacker's AS would need to be able to use the same key as the client
+ instance, but this setup would allow an attacker's AS to make use of
+ a compromised key within a system. This attack can be prevented by
+ only binding access tokens to the client instance's presented keys
+ and by having client instances have a strong association between
+ which keys they expect to use and the AS they expect to use them on.
+ This attack is also only able to be propagated on client instances
+ that talk to more than one AS at runtime, which can be limited by the
+ client software.
+
+11.22. Key Rotation Policy
+
+ When keys are rotated, there could be a delay in the propagation of
+ that rotation to various components in the AS's ecosystem. The AS
+ can define its own policy regarding the timeout of the previously
+ bound key, either making it immediately obsolete or allowing for a
+ limited grace period during which both the previously bound key and
+ the current key can be used for signing requests. Such a grace
+ period can be useful when there are multiple running copies of the
+ client that are coordinated with each other. For example, the client
+ software could be deployed as a cloud service with multiple
+ orchestrated nodes. Each of these copies is deployed using the same
+ key; therefore, all the nodes represent the same client instance to
+ the AS. In such cases, it can be difficult, or even impossible, to
+ update the keys on all these copies in the same instant.
+
+ The need to accommodate such known delays in the system needs to be
+ balanced with the risk of allowing an old key to still be used.
+ Narrowly restricting the exposure opportunities for exploit at the AS
+ in terms of time, place, and method makes exploit significantly more
+ difficult, especially if the exception happens only once. For
+ example, the AS can reject requests from the previously bound key (or
+ any previous one before it) to cause rotation to a new key or at
+ least ensure that the rotation happens in an idempotent way to the
+ same new key.
+
+ See also the related considerations for token values in
+ Section 11.33.
+
+11.23. Interaction Finish Modes and Polling
+
+ During the interaction process, the client instance usually hands
+ control of the user experience over to another component, be it the
+ system browser, another application, or some action the RO is
+ instructed to take on another device. By using an interaction finish
+ method, the client instance can be securely notified by the AS when
+ the interaction is completed and the next phase of the protocol
+ should occur. This process includes information that the client
+ instance can use to validate the finish call from the AS and prevent
+ some injection, session hijacking, and phishing attacks.
+
+ Some types of client deployment are unable to receive an interaction
+ finish message. Without an interaction finish method to notify it,
+ the client instance will need to poll the grant continuation API
+ while waiting for the RO to approve or deny the request. An attacker
+ could take advantage of this situation by capturing the interaction
+ start parameters and phishing a legitimate user into authorizing the
+ attacker's waiting client instance, which would in turn have no way
+ of associating the completed interaction from the targeted user with
+ the start of the request from the attacker.
+
+ However, it is important to note that this pattern is practically
+ indistinguishable from some legitimate use cases. For example, a
+ smart device emits a code for the RO to enter on a separate device.
+ The smart device has to poll because the expected behavior is that
+ the interaction will take place on the separate device, without a way
+ to return information to the original device's context.
+
+ As such, developers need to weigh the risks of forgoing an
+ interaction finish method against the deployment capabilities of the
+ client software and its environment. Due to the increased security,
+ an interaction finish method should be employed whenever possible.
+
+11.24. Session Management for Interaction Finish Methods
+
+ When using an interaction finish method such as redirect or push, the
+ client instance receives an unsolicited inbound request from an
+ unknown party over HTTPS. The client instance needs to be able to
+ successfully associate this incoming request with a specific pending
+ grant request being managed by the client instance. If the client
+ instance is not careful and precise about this, an attacker could
+ associate their own session at the client instance with a stolen
+ interaction response. The means of preventing this vary by the type
+ of client software and interaction methods in use. Some common
+ patterns are enumerated here.
+
+ If the end user interacts with the client instance through a web
+ browser and the redirect interaction finish method is used, the
+ client instance can ensure that the incoming HTTP request from the
+ finish method is presented in the same browser session that the grant
+ request was started in. This technique is particularly useful when
+ the redirect interaction start mode is used as well, since in many
+ cases, the end user will follow the redirection with the same browser
+ that they are using to interact with the client instance. The client
+ instance can then store the relevant pending grant information in the
+ session, either in the browser storage directly (such as with a
+ single-page application) or in an associated session store on a
+ backend server. In both cases, when the incoming request reaches the
+ client instance, the session information can be used to ensure that
+ the same party that started the request is present as the request
+ finishes.
+
+ Ensuring that the same party that started a request is present when
+ that request finishes can prevent phishing attacks, where an attacker
+ starts a request at an honest client instance and tricks an honest RO
+ into authorizing it. For example, if an honest end user (that also
+ acts as the RO) wants to start a request through a client instance
+ controlled by the attacker, the attacker can start a request at an
+ honest client instance and then redirect the honest end user to the
+ interaction URI from the attackers session with the honest client
+ instance. If the honest end user then fails to realize that they are
+ not authorizing the attacker-controlled client instance (with which
+ it started its request) but instead the honest client instance when
+ interacting with the AS, the attacker's session with the honest
+ client instance would be authorized. This would give the attacker
+ access to the honest end user's resources that the honest client
+ instance is authorized to access. However, if after the interaction,
+ the AS redirects the honest end user back to the client instance
+ whose grant request the end user just authorized, the honest end user
+ is redirected to the honest client instance. The honest client
+ instance can then detect that the end user is not the party that
+ started the request, since the request at the honest client instance
+ was started by the attacker. This detection can prevent the attack.
+ This is related to the discussion in Section 11.15, because again the
+ attack can be prevented by the AS informing the user as much as
+ possible about the client instance that is to be authorized.
+
+ If the end user does not interact with the client instance through a
+ web browser or the interaction start method does not use the same
+ browser or device that the end user is interacting through (such as
+ the launch of a second device through a scannable code or
+ presentation of a user code), the client instance will not be able to
+ strongly associate an incoming HTTP request with an established
+ session with the end user. This is also true when the push
+ interaction finish method is used, since the HTTP request comes
+ directly from the interaction component of the AS. In these
+ circumstances, the client instance can at least ensure that the
+ incoming HTTP request can be uniquely associated with an ongoing
+ grant request by making the interaction finish callback URI unique
+ for the grant when making the interaction request (Section 2.5.2).
+ Mobile applications and other client instances that generally serve
+ only a single end user at a time can use this unique incoming URL to
+ differentiate between a legitimate incoming request and an attacker's
+ stolen request.
+
+11.25. Calculating Interaction Hash
+
+ While the use of GNAP's signing mechanisms and token-protected grant
+ API provides significant security protections to the protocol, the
+ interaction reference mechanism is susceptible to monitoring,
+ capture, and injection by an attacker. To combat this, GNAP requires
+ the calculation and verification of an interaction hash. A client
+ instance might be tempted to skip this step, but doing so leaves the
+ client instance open to injection and manipulation by an attacker
+ that could lead to additional issues.
+
+ The calculation of the interaction hash value provides defense in
+ depth, allowing a client instance to protect itself from spurious
+ injection of interaction references when using an interaction finish
+ method. The AS is protected during this attack through the
+ continuation access token being bound to the expected interaction
+ reference, but without hash calculation, the attacker could cause the
+ client to make an HTTP request on command, which could itself be
+ manipulated -- for example, by including a malicious value in the
+ interaction reference designed to attack the AS. With both of these
+ in place, an attacker attempting to substitute the interaction
+ reference is stopped in several places.
+
+ .----. .------. +--------+ +--------+
+ | User | |Attacker| | Client | | AS |
+ | | | | |Instance| | |
+ | | | | | | | |
+ | | | +=(1)=>| | | |
+ | | | | | +-(2)->| |
+ | | | | | |<-(3)-+ |
+ | | | |<=(4)=+ | | |
+ | | | | | | | |
+ | | | +==(5)================>| |
+ | | | | | | | |
+ | | | |<================(6)==+ |
+ | | | | | | | |
+ | +==(A)================>| | | |
+ | | | | | +-(B)->| |
+ | | | | | |<-(C)-+ |
+ | |<=================(D)=+ | | |
+ | | | | | | | |
+ | +==(E)================================>| |
+ | | | | | | | |
+ | |<=(7)=+ | | | | |
+ | | | | | | | |
+ | +==(F)================>| | | |
+ | | | | | +-(G)->| |
+ | | | | | | | |
+ `----` `------` +--------+ +--------+
+
+ Figure 11: Interaction Hash Attack
+
+ Prerequisites: The client instance can allow multiple end users to
+ access the same AS. The attacker is attempting to associate their
+ rights with the target user's session.
+
+ * (1) The attacker starts a session at the client instance.
+
+ * (2) The client instance creates a grant request with nonce CN1.
+
+ * (3) The AS responds to the grant request with a need to interact,
+ nonce SN1, and a continuation token, CT1.
+
+ * (4) The client instructs the attacker to interact at the AS.
+
+ * (5) The attacker interacts at the AS.
+
+ * (6) The AS completes the interact finish with interact reference
+ IR1 and interact hash IH1 calculated from (CN1 + SN1 + IR1 + AS).
+ The attacker prevents IR1 from returning to the client instance.
+
+ * (A) The target user starts a session at the client instance.
+
+ * (B) The client instance creates a grant request with nonce CN2.
+
+ * (C) The AS responds to the grant request with a need to interact,
+ nonce SN2, and a continuation token, CT2.
+
+ * (D) The client instance instructs the user to interact at the AS.
+
+ * (E) The target user interacts at the AS.
+
+ * (7) Before the target user can complete their interaction, the
+ attacker delivers their own interact reference IR1 into the user's
+ session. The attacker cannot calculate the appropriate hash
+ because the attacker does not have access to CN2 and SN2.
+
+ * (F) The target user triggers the interaction finish in their own
+ session with the attacker's IR1.
+
+ * (G) If the client instance is checking the interaction hash, the
+ attack stops here because the hash calculation of (CN2 + SN2 + IR1
+ + AS) will fail. If the client instance does not check the
+ interaction hash, the client instance will be tricked into
+ submitting the interaction reference to the AS. Here, the AS will
+ reject the interaction request because it is presented against CT2
+ and not CT1 as expected. However, an attacker who has potentially
+ injected CT1 as the value of CT2 would be able to continue the
+ attack.
+
+ Even with additional checks in place, client instances using
+ interaction finish mechanisms are responsible for checking the
+ interaction hash to provide security to the overall system.
+
+11.26. Storage of Information during Interaction and Continuation
+
+ When starting an interactive grant request, a client application has
+ a number of protocol elements that it needs to manage, including
+ nonces, references, keys, access tokens, and other elements. During
+ the interaction process, the client instance usually hands control of
+ the user experience over to another component, be it the system
+ browser, another application, or some action the RO is instructed to
+ take on another device. In order for the client instance to make its
+ continuation call, it will need to recall all of these protocol
+ elements at a future time. Usually, this means the client instance
+ will need to store these protocol elements in some retrievable
+ fashion.
+
+ If the security protocol elements are stored on the end user's
+ device, such as in browser storage or in local application data
+ stores, capture and exfiltration of this information could allow an
+ attacker to continue a pending transaction instead of the client
+ instance. Client software can make use of secure storage mechanisms,
+ including hardware-based key and data storage, to prevent such
+ exfiltration.
+
+ Note that in GNAP, the client instance has to choose its interaction
+ finish URI prior to making the first call to the AS. As such, the
+ interaction finish URI will often have a unique identifier for the
+ ongoing request, allowing the client instance to access the correct
+ portion of its storage. Since this URI is passed to other parties
+ and often used through a browser, this URI should not contain any
+ security-sensitive information that would be valuable to an attacker,
+ such as any token identifier, nonce, or user information. Instead, a
+ cryptographically random value is suggested, and that value should be
+ used to index into a secure session or storage mechanism.
+
+11.27. Denial of Service (DoS) through Grant Continuation
+
+ When a client instance starts off an interactive process, it will
+ eventually need to continue the grant request in a subsequent message
+ to the AS. It's possible for a naive client implementation to
+ continuously send continuation requests to the AS while waiting for
+ approval, especially if no interaction finish method is used. Such
+ constant requests could overwhelm the AS's ability to respond to both
+ these and other requests.
+
+ To mitigate this for well-behaved client software, the continuation
+ response contains a wait parameter that is intended to tell the
+ client instance how long it should wait until making its next
+ request. This value can be used to back off client software that is
+ checking too quickly by returning increasing wait times for a single
+ client instance.
+
+ If client software ignores the wait value and makes its continuation
+ calls too quickly or if the client software assumes the absence of
+ the wait values means it should poll immediately, the AS can choose
+ to return errors to the offending client instance, including possibly
+ canceling the ongoing grant request. With well-meaning client
+ software, these errors can indicate a need to change the client
+ software's programmed behavior.
+
+11.28. Exhaustion of Random Value Space
+
+ Several parts of the GNAP process make use of unguessable randomized
+ values, such as nonces, tokens, user codes, and randomized URIs.
+ Since these values are intended to be unique, a sufficiently powerful
+ attacker could make a large number of requests to trigger generation
+ of randomized values in an attempt to exhaust the random number
+ generation space. While this attack is particularly applicable to
+ the AS, client software could likewise be targeted by an attacker
+ triggering new grant requests against an AS.
+
+ To mitigate this, software can ensure that its random values are
+ chosen from a significantly large pool so that exhaustion of that
+ pool is prohibitive for an attacker. Additionally, the random values
+ can be time-boxed in such a way that their validity windows are
+ reasonably short. Since many of the random values used within GNAP
+ are used within limited portions of the protocol, it is reasonable
+ for a particular random value to be valid for only a small amount of
+ time. For example, the nonces used for interaction finish hash
+ calculation need only to be valid while the client instance is
+ waiting for the finish callback and can be functionally expired when
+ the interaction has completed. Similarly, artifacts like access
+ tokens and the interaction reference can be limited to have lifetimes
+ tied to their functional utility. Finally, each different category
+ of artifact (nonce, token, reference, identifier, etc.) can be
+ generated from a separate random pool of values instead of a single
+ global value space.
+
+11.29. Front-Channel URIs
+
+ Some interaction methods in GNAP make use of URIs accessed through
+ the end user's browser, known collectively as front-channel
+ communication. These URIs are most notably present in the redirect
+ interaction start method and the redirect interaction finish mode.
+ Since these URIs are intended to be given to the end user, the end
+ user and their browser will be subjected to anything hosted at that
+ URI including viruses, malware, and phishing scams. This kind of
+ risk is inherent to all redirection-based protocols, including GNAP,
+ when used in this way.
+
+ When talking to a new or unknown AS, a client instance might want to
+ check the URI from the interaction start against a blocklist and warn
+ the end user before redirecting them. Many client instances will
+ provide an interstitial message prior to redirection in order to
+ prepare the user for control of the user experience being handed to
+ the domain of the AS, and such a method could be used to warn the
+ user of potential threats (for instance, a rogue AS impersonating a
+ well-known service provider). Client software can also prevent this
+ by managing an allowlist of known and trusted ASes.
+
+ Alternatively, an attacker could start a GNAP request with a known
+ and trusted AS but include their own attack site URI as the callback
+ for the redirect finish method. The attacker would then send the
+ interaction start URI to the victim and get them to click on it.
+ Since the URI is at the known AS, the victim is inclined to do so.
+ The victim will then be prompted to approve the attacker's
+ application, and in most circumstances, the victim will then be
+ redirected to the attacker's site whether or not the user approved
+ the request. The AS could mitigate this partially by using a
+ blocklist and allowlist of interaction finish URIs during the client
+ instance's initial request, but this approach can be especially
+ difficult if the URI has any dynamic portion chosen by the client
+ software. The AS can couple these checks with policies associated
+ with the client instance that has been authenticated in the request.
+ If the AS has any doubt about the interaction finish URI, the AS can
+ provide an interstitial warning to the end user before processing the
+ redirect.
+
+ Ultimately, all protocols that use redirect-based communication
+ through the user's browser are susceptible to having an attacker try
+ to co-opt one or more of those URIs in order to harm the user. It is
+ the responsibility of the AS and the client software to provide
+ appropriate warnings, education, and mitigation to protect end users.
+
+11.30. Processing Assertions
+
+ Identity assertions can be used in GNAP to convey subject
+ information, both from the AS to the client instance in a response
+ (Section 3.4) and from the client instance to the AS in a request
+ (Section 2.2). In both of these circumstances, when an assertion is
+ passed in GNAP, the receiver of the assertion needs to parse and
+ process the assertion. As assertions are complex artifacts with
+ their own syntax and security, special care needs to be taken to
+ prevent the assertion values from being used as an attack vector.
+
+ All assertion processing needs to account for the security aspects of
+ the assertion format in use. In particular, the processor needs to
+ parse the assertion from a JSON string object and apply the
+ appropriate cryptographic processes to ensure the integrity of the
+ assertion.
+
+ For example, when SAML 2.0 assertions are used, the receiver has to
+ parse an XML document. There are many well-known security
+ vulnerabilities in XML parsers, and the XML standard itself can be
+ attacked through the use of processing instructions and entity
+ expansions to cause problems with the processor. Therefore, any
+ system capable of processing SAML 2.0 assertions also needs to have a
+ secure and correct XML parser. In addition to this, the SAML 2.0
+ specification uses XML Signatures, which have their own
+ implementation problems that need to be accounted for. Similar
+ requirements exist for OpenID Connect ID Token, which is based on the
+ JWT format and the related JOSE cryptography suite.
+
+11.31. Stolen Token Replay
+
+ If a client instance can request tokens at multiple ASes and the
+ client instance uses the same keys to make its requests across those
+ different ASes, then it is possible for an attacker to replay a
+ stolen token issued by an honest AS from a compromised AS, thereby
+ binding the stolen token to the client instance's key in a different
+ context. The attacker can manipulate the client instance into using
+ the stolen token at an RS, particularly at an RS that is expecting a
+ token from the honest AS. Since the honest AS issued the token and
+ the client instance presents the token with its expected bound key,
+ the attack succeeds.
+
+ This attack has several preconditions. In this attack, the attacker
+ does not need access to the client instance's key and cannot use the
+ stolen token directly at the RS, but the attacker is able to get the
+ access token value in some fashion. The client instance also needs
+ to be configured to talk to multiple ASes, including the attacker's
+ controlled AS. Finally, the client instance needs to be able to be
+ manipulated by the attacker to call the RS while using a token issued
+ from the stolen AS. The RS does not need to be compromised or made
+ to trust the attacker's AS.
+
+ To protect against this attack, the client instance can use a
+ different key for each AS that it talks to. Since the replayed token
+ will be bound to the key used at the honest AS, the uncompromised RS
+ will reject the call since the client instance will be using the key
+ used at the attacker's AS instead with the same token. When the MTLS
+ key proofing method is used, a client instance can use self-signed
+ certificates to use a different key for each AS that it talks to, as
+ discussed in Section 11.4.
+
+ Additionally, the client instance can keep a strong association
+ between the RS and a specific AS that it trusts to issue tokens for
+ that RS. This strong binding also helps against some forms of AS
+ mix-up attacks (Section 11.12). Managing this binding is outside the
+ scope of this specification, but it can be managed either as a
+ configuration element for the client instance or dynamically through
+ discovering the AS from the RS (Section 9.1).
+
+ The details of this attack, with additional discussion and
+ considerations, are available in Section 3.2 of [HELMSCHMIDT2022].
+
+11.32. Self-Contained Stateless Access Tokens
+
+ The contents and format of the access token are at the discretion of
+ the AS and are opaque to the client instance within GNAP. As
+ discussed in [GNAP-RS], the AS and RS can make use of stateless
+ access tokens with an internal structure and format. These access
+ tokens allow an RS to validate the token without having to make any
+ external calls at runtime, allowing for benefits in some deployments,
+ the discussion of which is outside the scope of this specification.
+
+ However, the use of such self-contained access tokens has an effect
+ on the ability of the AS to provide certain functionality defined
+ within this specification. Specifically, since the access token is
+ self-contained, it is difficult or impossible for an AS to signal to
+ all RSs within an ecosystem when a specific access token has been
+ revoked. Therefore, an AS in such an ecosystem should probably not
+ offer token revocation functionality to client instances, since the
+ client instance's calls to such an endpoint are effectively
+ meaningless. However, a client instance calling the token revocation
+ function will also throw out its copy of the token, so such a placebo
+ endpoint might not be completely meaningless. Token rotation is
+ similarly difficult because the AS has to revoke the old access token
+ after a rotation call has been made. If the access tokens are
+ completely self-contained and non-revocable, this means that there
+ will be a period of time during which both the old and new access
+ tokens are valid and usable, which is an increased security risk for
+ the environment.
+
+ These problems can be mitigated by keeping the validity time windows
+ of self-contained access tokens reasonably short, limiting the time
+ after a revocation event that a revoked token could be used.
+ Additionally, the AS could proactively signal to RSs under its
+ control identifiers for revoked tokens that have yet to expire. This
+ type of information push would be expected to be relatively small and
+ infrequent, and its implementation is outside the scope of this
+ specification.
+
+11.33. Network Problems and Token and Grant Management
+
+ If a client instance makes a call to rotate an access token but the
+ network connection is dropped before the client instance receives the
+ response with the new access token, the system as a whole can end up
+ in an inconsistent state, where the AS has already rotated the old
+ access token and invalidated it, but the client instance only has
+ access to the invalidated access token and not the newly rotated
+ token value. If the client instance retries the rotation request, it
+ would fail because the client is no longer presenting a valid and
+ current access token. A similar situation can occur during grant
+ continuation, where the same client instance calls to continue or
+ update a grant request without successfully receiving the results of
+ the update.
+
+ To combat this, both grant management (Section 5) and token
+ management (Section 6) can be designed to be idempotent, where
+ subsequent calls to the same function with the same credentials are
+ meant to produce the same results. For example, multiple calls to
+ rotate the same access token need to result in the same rotated token
+ value, within a reasonable time window.
+
+ In practice, an AS can hold onto an old token value for such limited
+ purposes. For example, to support rotating access tokens over
+ unreliable networks, the AS receives the initial request to rotate an
+ access token and creates a new token value and returns it. The AS
+ also marks the old token value as having been used to create the
+ newly rotated token value. If the AS sees the old token value within
+ a small enough time window, such as a few seconds since the first
+ rotation attempt, the AS can return the same rotated access token
+ value. Furthermore, once the system has seen the newly rotated token
+ in use, the original token can be discarded because the client
+ instance has proved that it did receive the token. The result of
+ this is a system that is eventually self-consistent without placing
+ an undue complexity burden on the client instance to manage
+ problematic networks.
+
+11.34. Server-Side Request Forgery (SSRF)
+
+ There are several places within GNAP where a URI can be given to a
+ party, causing it to fetch that URI during normal operation of the
+ protocol. If an attacker is able to control the value of one of
+ these URIs within the protocol, the attacker could cause the target
+ system to execute a request on a URI that is within reach of the
+ target system but normally unavailable to the attacker. Examples
+ include an attacker sending a URL of http://localhost/admin to cause
+ the server to access an internal function on itself or
+ https://192.168.0.14/ to call a service behind a firewall. Even if
+ the attacker does not gain access to the results of the call, the
+ side effects of such requests coming from a trusted host can be
+ problematic to the security and sanctity of such otherwise unexposed
+ endpoints. This can be particularly problematic if such a URI is
+ used to call non-HTTP endpoints, such as remote code execution
+ services local to the AS.
+
+ The most vulnerable place in this specification is the push-based
+ post-interaction finish method (Section 4.2.2), as the client
+ instance is less trusted than the AS and can use this method to make
+ the AS call an arbitrary URI. While it is not required by the
+ protocol, the AS can fetch other URIs provided by the client
+ instance, such as the logo image or home page, for verification or
+ privacy-preserving purposes before displaying them to the RO as part
+ of a consent screen. Even if the AS does not fetch these URIs, their
+ use in GNAP's normal operation could cause an attack against the end
+ user's browser as it fetches these same attack URIs. Furthermore,
+ extensions to GNAP that allow or require URI fetch could also be
+ similarly susceptible, such as a system for having the AS fetch a
+ client instance's keys from a presented URI instead of the client
+ instance presenting the key by value. Such extensions are outside
+ the scope of this specification, but any system deploying such an
+ extension would need to be aware of this issue.
+
+ To help mitigate this problem, similar approaches that protect
+ parties against malicious redirects (Section 11.29) can be used. For
+ example, all URIs that can result in a direct request being made by a
+ party in the protocol can be filtered through an allowlist or
+ blocklist. For example, an AS that supports the push-based
+ interaction finish method can compare the callback URI in the
+ interaction request to a known URI for a pre-registered client
+ instance, or it can ensure that the URI is not on a blocklist of
+ sensitive URLs such as internal network addresses. However, note
+ that because these types of calls happen outside of the view of human
+ interaction, it is not usually feasible to provide notification and
+ warning to someone before the request needs to be executed, as is the
+ case with redirection URLs. As such, SSRF is somewhat more difficult
+ to manage at runtime, and systems should generally refuse to fetch a
+ URI if unsure.
+
+11.35. Multiple Key Formats
+
+ All keys presented by value are only allowed to be in a single
+ format. While it would seem beneficial to allow keys to be sent in
+ multiple formats in case the receiver doesn't understand one or more
+ of the formats used, there are security issues with such a feature.
+ If multiple keys formats are allowed, receivers of these key
+ definitions would need to be able to make sure that it's the same key
+ represented in each field and not simply use one of the key formats
+ without checking for equivalence. If equivalence is not carefully
+ checked, it is possible for an attacker to insert their own key into
+ one of the formats without needing to have control over the other
+ formats. This could potentially lead to a situation where one key is
+ used by part of the system (such as identifying the client instance)
+ and a different key in a different format in the same message is used
+ for other things (such as calculating signature validity). However,
+ in such cases, it is impossible for the receiver to ensure that all
+ formats contain the same key information since it is assumed that the
+ receiver cannot understand all of the formats.
+
+ To combat this, all keys presented by value have to be in exactly one
+ supported format known by the receiver as discussed in Section 7.1.
+ In most cases, a client instance is going to be configured with its
+ keys in a single format, and it will simply present that format as is
+ to the AS in its request. A client instance capable of multiple
+ formats can use AS discovery (Section 9) to determine which formats
+ are supported, if desired. An AS should be generous in supporting
+ many different key formats to allow different types of client
+ software and client instance deployments. An AS implementation
+ should try to support multiple formats to allow a variety of client
+ software to connect.
+
+11.36. Asynchronous Interactions
+
+ GNAP allows the RO to be contacted by the AS asynchronously, outside
+ the regular flow of the protocol. This allows for some advanced use
+ cases, such as cross-user authentication or information release, but
+ such advanced use cases have some distinct issues that implementors
+ need to be fully aware of before using these features.
+
+ First, in many applications, the return of subject information to the
+ client instance could indicate to the client instance that the end
+ user is the party represented by that information, functionally
+ allowing the end user to authenticate to the client application.
+ While the details of a fully functional authentication protocol are
+ outside the scope of GNAP, it is a common exercise for a client
+ instance to request information about the end user. This is
+ facilitated by several interaction methods (Section 4.1) defined in
+ GNAP that allow the end user to begin interaction directly with the
+ AS. However, when the subject of the information is intentionally
+ not the end user, the client application will need some way to
+ differentiate between requests for authentication of the end user and
+ requests for information about a different user. Confusing these
+ states could lead to an attacker having their account associated with
+ a privileged user. Client instances can mitigate this by having
+ distinct code paths for primary end-user authentication and for
+ requesting subject information about secondary users, such as in a
+ call center. In such use cases, the client software used by the RO
+ (the caller) and the end user (the agent) are generally distinct,
+ allowing the AS to differentiate between the agent's corporate device
+ making the request and the caller's personal device approving the
+ request.
+
+ Second, ROs that interact asynchronously do not usually have the same
+ context as an end user in an application attempting to perform the
+ task needing authorization. As such, the asynchronous requests for
+ authorization coming to the RO from the AS might have very little to
+ do with what the RO is doing at the time. This situation can
+ consequently lead to authorization fatigue on the part of the RO,
+ where any incoming authorization request is quickly approved and
+ dispatched without the RO making a proper verification of the
+ request. An attacker can exploit this fatigue and get the RO to
+ authorize the attacker's system for access. To mitigate this, AS
+ systems deploying asynchronous authorization should only prompt the
+ RO when the RO is expecting such a request, and significant user
+ experience engineering efforts need to be employed to ensure that the
+ RO can clearly make the appropriate security decision. Furthermore,
+ audit capability and the ability to undo access decisions that may be
+ ongoing are particularly important in the asynchronous case.
+
+11.37. Compromised RS
+
+ An attacker may aim to gain access to confidential or sensitive
+ resources. The measures for hardening and monitoring RS systems
+ (beyond protection with access tokens) are out of the scope of this
+ document, but the use of GNAP to protect a system does not absolve
+ the RS of following best practices. GNAP generally considers that a
+ breach can occur and therefore advises to prefer key-bound tokens
+ whenever possible, which at least limits the impact of access token
+ leakage by a compromised or malicious RS.
+
+11.38. AS-Provided Token Keys
+
+ While the most common token-issuance pattern is to bind the access
+ token to the client instance's presented key, it is possible for the
+ AS to provide a binding key along with an access token, as shown by
+ the key field of the token response in Section 3.2.1. This practice
+ allows for an AS to generate and manage the keys associated with
+ tokens independently of the keys known to client instances.
+
+ If the key material is returned by value from the AS, then the client
+ instance will simply use this key value when presenting the token.
+ This can be exploited by an attacker to issue a compromised token to
+ an unsuspecting client, assuming that the client instance trusts the
+ attacker's AS to issue tokens for the target RS. In this attack, the
+ attacker first gets a token bound to a key under the attacker's
+ control. This token is likely bound to an authorization or account
+ controlled by the attacker. The attacker then reissues that same
+ token to the client instance, this time acting as an AS. The
+ attacker can return their own key to the client instance, tricking
+ the client instance into using the attacker's token. Such an attack
+ is also possible when the key is returned by reference, if the
+ attacker is able to provide a reference meaningful to the client
+ instance that references a key under the attacker's control. This
+ substitution attack is similar to some of the main issues found with
+ bearer tokens as discussed in Section 11.9.
+
+ Returning a key with an access token should be limited to
+ circumstances where both the client and AS can be verified to be
+ honest and when the trade-off of not using a client instance's own
+ keys is worth the additional risk.
+
+12. Privacy Considerations
+
+ The privacy considerations in this section are modeled after the list
+ of privacy threats in "Privacy Considerations for Internet Protocols"
+ [RFC6973] and either explain how these threats are mitigated or
+ advise how the threats relate to GNAP.
+
+12.1. Surveillance
+
+ Surveillance is the observation or monitoring of an individual's
+ communications or activities. Surveillance can be conducted by
+ observers or eavesdroppers at any point along the communications
+ path.
+
+ GNAP assumes the TLS protection used throughout the spec is intact.
+ Without the protection of TLS, there are many points throughout the
+ use of GNAP that could lead to possible surveillance. Even with the
+ proper use of TLS, surveillance could occur by several parties
+ outside of the TLS-protected channels, as discussed in the
+ subsections below.
+
+12.1.1. Surveillance by the Client
+
+ The purpose of GNAP is to authorize clients to be able to access
+ information on behalf of a user. So while it is expected that the
+ client may be aware of the user's identity as well as data being
+ fetched for that user, in some cases, the extent of the client may be
+ beyond what the user is aware of. For example, a client may be
+ implemented as multiple distinct pieces of software, such as a
+ logging service or a mobile application that reports usage data to an
+ external backend service. Each of these pieces could gain
+ information about the user without the user being aware of this
+ action.
+
+ When the client software uses a hosted asset for its components, such
+ as its logo image, the fetch of these assets can reveal user actions
+ to the host. If the AS presents the logo URI to the RO in a browser
+ page, the browser will fetch the logo URL from the authorization
+ screen. This fetch will tell the host of the logo image that someone
+ is accessing an instance of the client software and requesting access
+ for it. This is particularly problematic when the host of the asset
+ is not the client software itself, such as when a content delivery
+ network is used.
+
+12.1.2. Surveillance by the Authorization Server
+
+ The role of the AS is to manage the authorization of client instances
+ to protect access to the user's data. In this role, the AS is by
+ definition aware of each authorization of a client instance by a
+ user. When the AS shares user information with the client instance,
+ it needs to make sure that it has the permission from that user to do
+ so.
+
+ Additionally, as part of the authorization grant process, the AS may
+ be aware of which RSs the client intends to use an access token at.
+ However, it is possible to design a system using GNAP in which this
+ knowledge is not made available to the AS, such as by avoiding the
+ use of the locations object in the authorization request.
+
+ If the AS's implementation of access tokens is such that it requires
+ an RS callback to the AS to validate them, then the AS will be aware
+ of which RSs are actively in use and by which users and clients. To
+ avoid this possibility, the AS would need to structure access tokens
+ in such a way that they can be validated by the RS without notifying
+ the AS that the token is being validated.
+
+12.2. Stored Data
+
+ Several parties in the GNAP process are expected to persist data at
+ least temporarily, if not semi-permanently, for the normal
+ functioning of the system. If compromised, this could lead to
+ exposure of sensitive information. This section documents the
+ potentially sensitive information each party in GNAP is expected to
+ store for normal operation. Naturally, it is possible for any party
+ to store information related to protocol mechanics (such as audit
+ logs, etc.) for longer than is technically necessary.
+
+ The AS is expected to store Subject Identifiers for users
+ indefinitely, in order to be able to include them in the responses to
+ clients. The AS is also expected to store client key identifiers
+ associated with display information about the client, such as its
+ name and logo.
+
+ The client is expected to store its client instance key indefinitely,
+ in order to authenticate to the AS for the normal functioning of the
+ GNAP flows. Additionally, the client will be temporarily storing
+ artifacts issued by the AS during a flow, and these artifacts ought
+ to be discarded by the client when the transaction is complete.
+
+ The RS is not required to store any state for its normal operation,
+ as far as its part in implementing GNAP. Depending on the
+ implementation of access tokens, the RS may need to cache public keys
+ from the AS in order to validate access tokens.
+
+12.3. Intrusion
+
+ Intrusion refers to the ability of various parties to send
+ unsolicited messages or cause denial of service for unrelated
+ parties.
+
+ If the RO is different from the end user, there is an opportunity for
+ the end user to cause unsolicited messages to be sent to the RO if
+ the system prompts the RO for consent when an end user attempts to
+ access their data.
+
+ The format and contents of Subject Identifiers are intentionally not
+ defined by GNAP. If the AS uses values for Subject Identifiers that
+ are also identifiers for communication channels (e.g., an email
+ address or phone number), this opens up the possibility for a client
+ to learn this information when it was not otherwise authorized to
+ access this kind of data about the user.
+
+12.4. Correlation
+
+ The threat of correlation is the combination of various pieces of
+ information related to an individual in a way that defies their
+ expectations of what others know about them.
+
+12.4.1. Correlation by Clients
+
+ The biggest risk of correlation in GNAP is when an AS returns stable,
+ consistent user identifiers to multiple different applications. In
+ this case, applications created by different parties would be able to
+ correlate these user identifiers out of band in order to know which
+ users they have in common.
+
+ The most common example of this in practice is tracking for
+ advertising purposes, such that a client shares their list of user
+ IDs with an ad platform that is then able to retarget ads to
+ applications created by other parties. In contrast, a positive
+ example of correlation is a corporate acquisition where two
+ previously unrelated clients now do need to be able to identify the
+ same user between the two clients, such as when software systems are
+ intentionally connected by the end user.
+
+ Another means of correlation comes from the use of RS-first discovery
+ (Section 9.1). A client instance that knows nothing other than an
+ RS's URL could make an unauthenticated call to the RS and learn which
+ AS protects the resources there. If the client instance knows
+ something about the AS, such as it being a single-user AS or
+ belonging to a specific organization, the client instance could,
+ through association, learn things about the resource without ever
+ gaining access to the resource itself.
+
+12.4.2. Correlation by Resource Servers
+
+ Unrelated RSs also have an opportunity to correlate users if the AS
+ includes stable user identifiers in access tokens or in access token
+ introspection responses.
+
+ In some cases, an RS may not actually need to be able to identify
+ users (such as an RS providing access to a company cafeteria menu,
+ which only needs to validate whether the user is a current employee),
+ so ASes should be thoughtful of when user identifiers are actually
+ necessary to communicate to RSs for the functioning of the system.
+
+ However, note that the lack of inclusion of a user identifier in an
+ access token may be a risk if there is a concern that two users may
+ voluntarily share access tokens between them in order to access
+ protected resources. For example, if a website wants to limit access
+ to only people over 18, and such does not need to know any user
+ identifiers, an access token may be issued by an AS contains only the
+ claim "over 18". If the user is aware that this access token doesn't
+ reference them individually, they may be willing to share the access
+ token with a user who is under 18 in order to let them get access to
+ the website. (Note that the binding of an access token to a non-
+ extractable client instance key also prevents the access token from
+ being voluntarily shared.)
+
+12.4.3. Correlation by Authorization Servers
+
+ Clients are expected to be identified by their client instance key.
+ If a particular client instance key is used at more than one AS, this
+ could open up the possibility for multiple unrelated ASes to
+ correlate client instances. This is especially a problem in the
+ common case where a client instance is used by a single individual,
+ as it would allow the ASes to correlate that individual between them.
+ If this is a concern of a client, the client should use distinct keys
+ with each AS.
+
+12.5. Disclosure in Shared References
+
+ Throughout many parts of GNAP, the parties pass shared references
+ between each other, sometimes in place of the values themselves (for
+ example, the interact_ref value used throughout the flow). These
+ references are intended to be random strings and should not contain
+ any private or sensitive data that could potentially leak information
+ between parties.
+
+13. References
+
+13.1. Normative References
+
+ [BCP195] Best Current Practice 195,
+ <https://www.rfc-editor.org/info/bcp195>.
+ At the time of writing, this BCP comprises the following:
+
+ Moriarty, K. and S. Farrell, "Deprecating TLS 1.0 and TLS
+ 1.1", BCP 195, RFC 8996, DOI 10.17487/RFC8996, March 2021,
+ <https://www.rfc-editor.org/info/rfc8996>.
+
+ Sheffer, Y., Saint-Andre, P., and T. Fossati,
+ "Recommendations for Secure Use of Transport Layer
+ Security (TLS) and Datagram Transport Layer Security
+ (DTLS)", BCP 195, RFC 9325, DOI 10.17487/RFC9325, November
+ 2022, <https://www.rfc-editor.org/info/rfc9325>.
+
+ [HASH-ALG] IANA, "Named Information Hash Algorithm Registry",
+ <https://www.iana.org/assignments/named-information/>.
+
+ [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
+ Ed., "HTTP Semantics", STD 97, RFC 9110,
+ DOI 10.17487/RFC9110, June 2022,
+ <https://www.rfc-editor.org/info/rfc9110>.
+
+ [OIDC] Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and
+ C. Mortimore, "OpenID Connect Core 1.0 incorporating
+ errata set 2", December 2023,
+ <https://openid.net/specs/openid-connect-core-1_0.html>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC2397] Masinter, L., "The "data" URL scheme", RFC 2397,
+ DOI 10.17487/RFC2397, August 1998,
+ <https://www.rfc-editor.org/info/rfc2397>.
+
+ [RFC3339] Klyne, G. and C. Newman, "Date and Time on the Internet:
+ Timestamps", RFC 3339, DOI 10.17487/RFC3339, July 2002,
+ <https://www.rfc-editor.org/info/rfc3339>.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, DOI 10.17487/RFC3986, January 2005,
+ <https://www.rfc-editor.org/info/rfc3986>.
+
+ [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data
+ Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006,
+ <https://www.rfc-editor.org/info/rfc4648>.
+
+ [RFC5646] Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying
+ Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646,
+ September 2009, <https://www.rfc-editor.org/info/rfc5646>.
+
+ [RFC6749] Hardt, D., Ed., "The OAuth 2.0 Authorization Framework",
+ RFC 6749, DOI 10.17487/RFC6749, October 2012,
+ <https://www.rfc-editor.org/info/rfc6749>.
+
+ [RFC6750] Jones, M. and D. Hardt, "The OAuth 2.0 Authorization
+ Framework: Bearer Token Usage", RFC 6750,
+ DOI 10.17487/RFC6750, October 2012,
+ <https://www.rfc-editor.org/info/rfc6750>.
+
+ [RFC7468] Josefsson, S. and S. Leonard, "Textual Encodings of PKIX,
+ PKCS, and CMS Structures", RFC 7468, DOI 10.17487/RFC7468,
+ April 2015, <https://www.rfc-editor.org/info/rfc7468>.
+
+ [RFC7515] Jones, M., Bradley, J., and N. Sakimura, "JSON Web
+ Signature (JWS)", RFC 7515, DOI 10.17487/RFC7515, May
+ 2015, <https://www.rfc-editor.org/info/rfc7515>.
+
+ [RFC7517] Jones, M., "JSON Web Key (JWK)", RFC 7517,
+ DOI 10.17487/RFC7517, May 2015,
+ <https://www.rfc-editor.org/info/rfc7517>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
+ Interchange Format", STD 90, RFC 8259,
+ DOI 10.17487/RFC8259, December 2017,
+ <https://www.rfc-editor.org/info/rfc8259>.
+
+ [RFC8705] Campbell, B., Bradley, J., Sakimura, N., and T.
+ Lodderstedt, "OAuth 2.0 Mutual-TLS Client Authentication
+ and Certificate-Bound Access Tokens", RFC 8705,
+ DOI 10.17487/RFC8705, February 2020,
+ <https://www.rfc-editor.org/info/rfc8705>.
+
+ [RFC9111] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
+ Ed., "HTTP Caching", STD 98, RFC 9111,
+ DOI 10.17487/RFC9111, June 2022,
+ <https://www.rfc-editor.org/info/rfc9111>.
+
+ [RFC9421] Backman, A., Ed., Richer, J., Ed., and M. Sporny, "HTTP
+ Message Signatures", RFC 9421, DOI 10.17487/RFC9421,
+ February 2024, <https://www.rfc-editor.org/info/rfc9421>.
+
+ [RFC9493] Backman, A., Ed., Scurtescu, M., and P. Jain, "Subject
+ Identifiers for Security Event Tokens", RFC 9493,
+ DOI 10.17487/RFC9493, December 2023,
+ <https://www.rfc-editor.org/info/rfc9493>.
+
+ [RFC9530] Polli, R. and L. Pardue, "Digest Fields", RFC 9530,
+ DOI 10.17487/RFC9530, February 2024,
+ <https://www.rfc-editor.org/info/rfc9530>.
+
+ [SAML2] Cantor, S., Ed., Kemp, J., Ed., Philpott, R., Ed., and E.
+ Maler, Ed., "Assertions and Protocol for the OASIS
+ Security Assertion Markup Language (SAML) V2.0", OASIS
+ Standard, March 2005, <https://docs.oasis-
+ open.org/security/saml/v2.0/saml-core-2.0-os.pdf>.
+
+13.2. Informative References
+
+ [Auth-Schemes]
+ IANA, "HTTP Authentication Schemes",
+ <https://www.iana.org/assignments/http-authschemes>.
+
+ [AXELAND2021]
+ Axeland, Å. and O. Oueidat, "Security Analysis of Attack
+ Surfaces on the Grant Negotiation and Authorization
+ Protocol", Master's thesis, Department of Computer Science
+ and Engineering, Chalmers University of Technology and
+ University of Gothenburg, 2021,
+ <https://hdl.handle.net/20.500.12380/304105>.
+
+ [GNAP-REG] IANA, "Grant Negotiation and Authorization Protocol
+ (GNAP)", <https://www.iana.org/assignments/gnap>.
+
+ [GNAP-RS] Richer, J., Ed. and F. Imbault, "Grant Negotiation and
+ Authorization Protocol Resource Server Connections", Work
+ in Progress, Internet-Draft, draft-ietf-gnap-resource-
+ servers-09, 23 September 2024,
+ <https://datatracker.ietf.org/doc/html/draft-ietf-gnap-
+ resource-servers-09>.
+
+ [HELMSCHMIDT2022]
+ Helmschmidt, F., "Security Analysis of the Grant
+ Negotiation and Authorization Protocol", Master's thesis,
+ Institute of Information Security, University of Stuggart,
+ DOI 10.18419/opus-12203, 2022,
+ <http://dx.doi.org/10.18419/opus-12203>.
+
+ [MediaTypes]
+ IANA, "Media Types",
+ <https://www.iana.org/assignments/media-types>.
+
+ [OAUTH-SEC-TOPICS]
+ Lodderstedt, T., Bradley, J., Labunets, A., and D. Fett,
+ "OAuth 2.0 Security Best Current Practice", Work in
+ Progress, Internet-Draft, draft-ietf-oauth-security-
+ topics-29, 3 June 2024,
+ <https://datatracker.ietf.org/doc/html/draft-ietf-oauth-
+ security-topics-29>.
+
+ [promise-theory]
+ Bergstra, J. and M. Burgess, "Promise Theory: Principles
+ and Applications", Second Edition, XtAxis Press, 2019,
+ <http://markburgess.org/promises.html>.
+
+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Two: Media Types", RFC 2046,
+ DOI 10.17487/RFC2046, November 1996,
+ <https://www.rfc-editor.org/info/rfc2046>.
+
+ [RFC4107] Bellovin, S. and R. Housley, "Guidelines for Cryptographic
+ Key Management", BCP 107, RFC 4107, DOI 10.17487/RFC4107,
+ June 2005, <https://www.rfc-editor.org/info/rfc4107>.
+
+ [RFC6202] Loreto, S., Saint-Andre, P., Salsano, S., and G. Wilkins,
+ "Known Issues and Best Practices for the Use of Long
+ Polling and Streaming in Bidirectional HTTP", RFC 6202,
+ DOI 10.17487/RFC6202, April 2011,
+ <https://www.rfc-editor.org/info/rfc6202>.
+
+ [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type
+ Specifications and Registration Procedures", BCP 13,
+ RFC 6838, DOI 10.17487/RFC6838, January 2013,
+ <https://www.rfc-editor.org/info/rfc6838>.
+
+ [RFC6973] Cooper, A., Tschofenig, H., Aboba, B., Peterson, J.,
+ Morris, J., Hansen, M., and R. Smith, "Privacy
+ Considerations for Internet Protocols", RFC 6973,
+ DOI 10.17487/RFC6973, July 2013,
+ <https://www.rfc-editor.org/info/rfc6973>.
+
+ [RFC7518] Jones, M., "JSON Web Algorithms (JWA)", RFC 7518,
+ DOI 10.17487/RFC7518, May 2015,
+ <https://www.rfc-editor.org/info/rfc7518>.
+
+ [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for
+ Writing an IANA Considerations Section in RFCs", BCP 26,
+ RFC 8126, DOI 10.17487/RFC8126, June 2017,
+ <https://www.rfc-editor.org/info/rfc8126>.
+
+ [RFC8264] Saint-Andre, P. and M. Blanchet, "PRECIS Framework:
+ Preparation, Enforcement, and Comparison of
+ Internationalized Strings in Application Protocols",
+ RFC 8264, DOI 10.17487/RFC8264, October 2017,
+ <https://www.rfc-editor.org/info/rfc8264>.
+
+ [RFC8707] Campbell, B., Bradley, J., and H. Tschofenig, "Resource
+ Indicators for OAuth 2.0", RFC 8707, DOI 10.17487/RFC8707,
+ February 2020, <https://www.rfc-editor.org/info/rfc8707>.
+
+ [RFC8792] Watsen, K., Auerswald, E., Farrel, A., and Q. Wu,
+ "Handling Long Lines in Content of Internet-Drafts and
+ RFCs", RFC 8792, DOI 10.17487/RFC8792, June 2020,
+ <https://www.rfc-editor.org/info/rfc8792>.
+
+ [RFC9396] Lodderstedt, T., Richer, J., and B. Campbell, "OAuth 2.0
+ Rich Authorization Requests", RFC 9396,
+ DOI 10.17487/RFC9396, May 2023,
+ <https://www.rfc-editor.org/info/rfc9396>.
+
+ [RFC9440] Campbell, B. and M. Bishop, "Client-Cert HTTP Header
+ Field", RFC 9440, DOI 10.17487/RFC9440, July 2023,
+ <https://www.rfc-editor.org/info/rfc9440>.
+
+ [RFC9525] Saint-Andre, P. and R. Salz, "Service Identity in TLS",
+ RFC 9525, DOI 10.17487/RFC9525, November 2023,
+ <https://www.rfc-editor.org/info/rfc9525>.
+
+ [SP80063C] Grassi, P., Richer, J., Squire, S., Fenton, J., Nadeau,
+ E., Lefkovitz, N., Danker, J., Choong, Y., Greene, K., and
+ M. Theofanos, "Digital Identity Guidelines: Federation and
+ Assertions", NIST SP 800-63C, DOI 10.6028/NIST.SP.800-63c,
+ June 2017,
+ <https://nvlpubs.nist.gov/nistpubs/SpecialPublications/
+ NIST.SP.800-63c.pdf>.
+
+ [Subj-ID-Formats]
+ IANA, "Subject Identifier Formats",
+ <https://www.iana.org/assignments/secevent>.
+
+Appendix A. Comparison with OAuth 2.0
+
+ GNAP's protocol design differs from OAuth 2.0's in several
+ fundamental ways:
+
+ 1. *Consent and authorization flexibility:*
+
+ OAuth 2.0 generally assumes the user has access to a web browser.
+ The type of interaction available is fixed by the grant type, and
+ the most common interactive grant types start in the browser.
+ OAuth 2.0 assumes that the user using the client software is the
+ same user that will interact with the AS to approve access.
+
+ GNAP allows various patterns to manage authorizations and
+ consents required to fulfill this requested delegation, including
+ information sent by the client instance, information supplied by
+ external parties, and information gathered through the
+ interaction process. GNAP allows a client instance to list
+ different ways that it can start and finish an interaction, and
+ these can be mixed together as needed for different use cases.
+ GNAP interactions can use a browser, but they don't have to.
+ Methods can use inter-application messaging protocols, out-of-
+ band data transfer, or anything else. GNAP allows extensions to
+ define new ways to start and finish an interaction, as new
+ methods and platforms are expected to become available over time.
+ GNAP is designed to allow the end user and the RO to be two
+ different people, but it still works in the optimized case of
+ them being the same party.
+
+ 2. *Intent registration and inline negotiation:*
+
+ OAuth 2.0 uses different "grant types" that start at different
+ endpoints for different purposes. Many of these require
+ discovery of several interrelated parameters.
+
+ GNAP requests all start with the same type of request to the same
+ endpoint at the AS. Next steps are negotiated between the client
+ instance and AS based on software capabilities, policies
+ surrounding requested access, and the overall context of the
+ ongoing request. GNAP defines a continuation API that allows the
+ client instance and AS to request and send additional information
+ from each other over multiple steps. This continuation API uses
+ the same access token protection that other GNAP-protected APIs
+ use. GNAP allows discovery to optimize the requests, but it
+ isn't required thanks to the negotiation capabilities.
+
+ GNAP is able to handle the life cycle of an authorization request
+ and therefore simplifies the mental model surrounding OAuth2.
+ For instance, there's no need for refresh tokens when the API
+ enables proper rotation of access tokens.
+
+ 3. *Client instances:*
+
+ OAuth 2.0 requires all clients to be registered at the AS and to
+ use a client_id known to the AS as part of the protocol. This
+ client_id is generally assumed to be assigned by a trusted
+ authority during a registration process, and OAuth places a lot
+ of trust on the client_id as a result. Dynamic registration
+ allows different classes of clients to get a client_id at
+ runtime, even if they only ever use it for one request.
+
+ GNAP allows the client instance to present an unknown key to the
+ AS and use that key to protect the ongoing request. GNAP's
+ client instance identifier mechanism allows for pre-registered
+ clients and dynamically registered clients to exist as an
+ optimized case without requiring the identifier as part of the
+ protocol at all times.
+
+ 4. *Expanded delegation:*
+
+ OAuth 2.0 defines the "scope" parameter for controlling access to
+ APIs. This parameter has been coopted to mean a number of
+ different things in different protocols, including flags for
+ turning special behavior on and off and the return of data apart
+ from the access token. The "resource" indicator (defined in
+ [RFC8707]) and Rich Authorization Request (RAR) extensions (as
+ defined in [RFC9396]) expand on the "scope" concept in similar
+ but different ways.
+
+ GNAP defines a rich structure for requesting access (analogous to
+ RAR), with string references as an optimization (analogous to
+ scopes). GNAP defines methods for requesting directly returned
+ user information, separate from API access. This information
+ includes identifiers for the current user and structured
+ assertions. GNAP makes no assumptions or demands on the format
+ or contents of the access token, but the RS extension allows a
+ negotiation of token formats between the AS and RS.
+
+ 5. *Cryptography-based security:*
+
+ OAuth 2.0 uses shared bearer secrets, including the client_secret
+ and access token, and advanced authentication and sender
+ constraints have been built on after the fact in inconsistent
+ ways.
+
+ In GNAP, all communication between the client instance and AS is
+ bound to a key held by the client instance. GNAP uses the same
+ cryptographic mechanisms for both authenticating the client (to
+ the AS) and binding the access token (to the RS and the AS).
+ GNAP allows extensions to define new cryptographic protection
+ mechanisms, as new methods are expected to become available over
+ time. GNAP does not have the notion of "public clients" because
+ key information can always be sent and used dynamically.
+
+ 6. *Privacy and usable security:*
+
+ OAuth 2.0's deployment model assumes a strong binding between the
+ AS and the RS.
+
+ GNAP is designed to be interoperable with decentralized identity
+ standards and to provide a human-centric authorization layer. In
+ addition to this specification, GNAP supports various patterns of
+ communication between RSs and ASes through extensions. GNAP
+ tries to limit the odds of a consolidation to just a handful of
+ popular AS services.
+
+Appendix B. Example Protocol Flows
+
+ The protocol defined in this specification provides a number of
+ features that can be combined to solve many different kinds of
+ authentication scenarios. This section seeks to show examples of how
+ the protocol could be applied for different situations.
+
+ Some longer fields, particularly cryptographic information, have been
+ truncated for display purposes in these examples.
+
+B.1. Redirect-Based User Interaction
+
+ In this scenario, the user is the RO and has access to a web browser,
+ and the client instance can take front-channel callbacks on the same
+ device as the user. This combination is analogous to the OAuth 2.0
+ Authorization Code grant type.
+
+ The client instance initiates the request to the AS. Here, the
+ client instance identifies itself using its public key.
+
+ POST /tx HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "access_token": {
+ "access": [
+ {
+ "actions": [
+ "read",
+ "write",
+ "dolphin"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ]
+ }
+ ],
+ },
+ "client": {
+ "key": {
+ "proof": "httpsig",
+ "jwk": {
+ "kty": "RSA",
+ "e": "AQAB",
+ "kid": "xyz-1",
+ "alg": "RS256",
+ "n": "kOB5rR4Jv0GMeLaY6_It_r3ORwdf8ci_JtffXyaSx8..."
+ }
+ }
+ },
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.example.net/return/123455",
+ "nonce": "LKLTI25DK82FX4T4QFZC"
+ }
+ }
+ }
+
+ The AS processes the request and determines that the RO needs to
+ interact. The AS returns the following response that gives the
+ client instance the information it needs to connect. The AS has also
+ indicated to the client instance that it can use the given instance
+ identifier to identify itself in future requests (Section 2.3.1).
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+ Cache-Control: no-store
+
+ {
+ "interact": {
+ "redirect":
+ "https://server.example.com/interact/4CF492MLVMSW9MKM",
+ "finish": "MBDOFXG4Y5CVJCX821LH"
+ }
+ "continue": {
+ "access_token": {
+ "value": "80UPRY5NM33OMUKMKSKU"
+ },
+ "uri": "https://server.example.com/continue"
+ },
+ "instance_id": "7C7C4AZ9KHRS6X63AJAO"
+ }
+
+ The client instance saves the response and redirects the user to the
+ interaction start mode's "redirect" URI by sending the following HTTP
+ message to the user's browser.
+
+ HTTP 303 Found
+ Location: https://server.example.com/interact/4CF492MLVMSW9MKM
+
+ The user's browser fetches the AS's interaction URI. The user logs
+ in, is identified as the RO for the resource being requested, and
+ approves the request. Since the AS has a callback parameter that was
+ sent in the initial request's interaction finish method, the AS
+ generates the interaction reference, calculates the hash, and
+ redirects the user back to the client instance with these additional
+ values added as query parameters.
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ HTTP 302 Found
+ Location: https://client.example.net/return/123455\
+ ?hash=x-gguKWTj8rQf7d7i3w3UhzvuJ5bpOlKyAlVpLxBffY\
+ &interact_ref=4IFWWIKYBC2PQ6U56NL1
+
+ The client instance receives this request from the user's browser.
+ The client instance ensures that this is the same user that was sent
+ out by validating session information and retrieves the stored
+ pending request. The client instance uses the values in this to
+ validate the hash parameter. The client instance then calls the
+ continuation URI using the associated continuation access token and
+ presents the interaction reference in the request content. The
+ client instance signs the request as above.
+
+ POST /continue HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "interact_ref": "4IFWWIKYBC2PQ6U56NL1"
+ }
+
+ The AS retrieves the pending request by looking up the pending grant
+ request associated with the presented continuation access token.
+ Seeing that the grant is approved, the AS issues an access token and
+ returns this to the client instance.
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+ Cache-Control: no-store
+
+ {
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "manage": "https://server.example.com/token/PRY5NM33O\
+ M4TB8N6BW7OZB8CDFONP219RP1L",
+ "access": [{
+ "actions": [
+ "read",
+ "write",
+ "dolphin"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ]
+ }]
+ },
+ "continue": {
+ "access_token": {
+ "value": "80UPRY5NM33OMUKMKSKU"
+ },
+ "uri": "https://server.example.com/continue"
+ }
+ }
+
+B.2. Secondary Device Interaction
+
+ In this scenario, the user does not have access to a web browser on
+ the device and must use a secondary device to interact with the AS.
+ The client instance can display a user code or a printable QR code.
+ The client instance is not able to accept callbacks from the AS and
+ needs to poll for updates while waiting for the user to authorize the
+ request.
+
+ The client instance initiates the request to the AS.
+
+ POST /tx HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "access_token": {
+ "access": [
+ "dolphin-metadata", "some other thing"
+ ],
+ },
+ "client": "7C7C4AZ9KHRS6X63AJAO",
+ "interact": {
+ "start": ["redirect", "user_code"]
+ }
+ }
+
+ The AS processes this and determines that the RO needs to interact.
+ The AS supports both redirect URIs and user codes for interaction, so
+ it includes both. Since there is no interaction finish mode, the AS
+ does not include a nonce but does include a "wait" parameter on the
+ continuation section because it expects the client instance to poll
+ for results.
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+ Cache-Control: no-store
+
+ {
+ "interact": {
+ "redirect": "https://srv.ex/MXKHQ",
+ "user_code": {
+ "code": "A1BC3DFF"
+ }
+ },
+ "continue": {
+ "access_token": {
+ "value": "80UPRY5NM33OMUKMKSKU"
+ },
+ "uri": "https://server.example.com/continue/VGJKPTKC50",
+ "wait": 60
+ }
+ }
+
+ The client instance saves the response and displays the user code
+ visually on its screen along with the static device URI. The client
+ instance also displays the short interaction URI as a QR code to be
+ scanned.
+
+ If the user scans the code, they are taken to the interaction
+ endpoint, and the AS looks up the current pending request based on
+ the incoming URI. If the user instead goes to the static page and
+ enters the code manually, the AS looks up the current pending request
+ based on the value of the user code. In both cases, the user logs
+ in, is identified as the RO for the resource being requested, and
+ approves the request. Once the request has been approved, the AS
+ displays to the user a message to return to their device.
+
+ Meanwhile, the client instance polls the AS every 60 seconds at the
+ continuation URI. The client instance signs the request using the
+ same key and method that it did in the first request.
+
+ POST /continue/VGJKPTKC50 HTTP/1.1
+ Host: server.example.com
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ The AS retrieves the pending request based on the pending grant
+ request associated with the continuation access token and determines
+ that it has not yet been authorized. The AS indicates to the client
+ instance that no access token has yet been issued but it can continue
+ to call after another 60-second timeout.
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+ Cache-Control: no-store
+
+ {
+ "continue": {
+ "access_token": {
+ "value": "G7YQT4KQQ5TZY9SLSS5E"
+ },
+ "uri": "https://server.example.com/continue/ATWHO4Q1WV",
+ "wait": 60
+ }
+ }
+
+ Note that the continuation URI and access token have been rotated
+ since they were used by the client instance to make this call. The
+ client instance polls the continuation URI after a 60-second timeout
+ using this new information.
+
+ POST /continue/ATWHO4Q1WV HTTP/1.1
+ Host: server.example.com
+ Authorization: GNAP G7YQT4KQQ5TZY9SLSS5E
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ The AS retrieves the pending request based on the URI and access
+ token, determines that it has been approved, and issues an access
+ token for the client to use at the RS.
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+ Cache-Control: no-store
+
+ {
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "manage": "https://server.example.com/token/PRY5NM33O\
+ M4TB8N6BW7OZB8CDFONP219RP1L",
+ "access": [
+ "dolphin-metadata", "some other thing"
+ ]
+ }
+ }
+
+B.3. No User Involvement
+
+ In this scenario, the client instance is requesting access on its own
+ behalf, with no user to interact with.
+
+ The client instance creates a request to the AS, identifying itself
+ with its public key and using MTLS to make the request.
+
+ POST /tx HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+
+ {
+ "access_token": {
+ "access": [
+ "backend service", "nightly-routine-3"
+ ],
+ },
+ "client": {
+ "key": {
+ "proof": "mtls",
+ "cert#S256": "bwcK0esc3ACC3DB2Y5_lESsXE8o9ltc05O89jdN-dg2"
+ }
+ }
+ }
+
+ The AS processes this, determines that the client instance can ask
+ for the requested resources, and issues an access token.
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+ Cache-Control: no-store
+
+ {
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "manage": "https://server.example.com/token",
+ "access": [
+ "backend service", "nightly-routine-3"
+ ]
+ }
+ }
+
+B.4. Asynchronous Authorization
+
+ In this scenario, the client instance is requesting on behalf of a
+ specific RO but has no way to interact with the user. The AS can
+ asynchronously reach out to the RO for approval in this scenario.
+
+ The client instance starts the request at the AS by requesting a set
+ of resources. The client instance also identifies a particular user.
+
+ POST /tx HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "access_token": {
+ "access": [
+ {
+ "type": "photo-api",
+ "actions": [
+ "read",
+ "write",
+ "dolphin"
+ ],
+ "locations": [
+ "https://server.example.net/",
+ "https://resource.local/other"
+ ],
+ "datatypes": [
+ "metadata",
+ "images"
+ ]
+ },
+ "read", "dolphin-metadata",
+ {
+ "type": "financial-transaction",
+ "actions": [
+ "withdraw"
+ ],
+ "identifier": "account-14-32-32-3",
+ "currency": "USD"
+ },
+ "some other thing"
+ ],
+ },
+ "client": "7C7C4AZ9KHRS6X63AJAO",
+ "user": {
+ "sub_ids": [ {
+ "format": "opaque",
+ "id": "J2G8G8O4AZ"
+ } ]
+ }
+ }
+
+ The AS processes this and determines that the RO needs to interact.
+ The AS determines that it can reach the identified user
+ asynchronously and that the identified user does have the ability to
+ approve this request. The AS indicates to the client instance that
+ it can poll for continuation.
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+ Cache-Control: no-store
+
+ {
+ "continue": {
+ "access_token": {
+ "value": "80UPRY5NM33OMUKMKSKU"
+ },
+ "uri": "https://server.example.com/continue",
+ "wait": 60
+ }
+ }
+
+ The AS reaches out to the RO and prompts them for consent. In this
+ example scenario, the AS has an application that it can push
+ notifications to for the specified account.
+
+ Meanwhile, the client instance periodically polls the AS every 60
+ seconds at the continuation URI.
+
+ POST /continue HTTP/1.1
+ Host: server.example.com
+ Authorization: GNAP 80UPRY5NM33OMUKMKSKU
+ Signature-Input: sig1=...
+ Signature: sig1=...
+
+ The AS retrieves the pending request based on the continuation access
+ token and determines that it has not yet been authorized. The AS
+ indicates to the client instance that no access token has yet been
+ issued but it can continue to call after another 60-second timeout.
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+ Cache-Control: no-store
+
+ {
+ "continue": {
+ "access_token": {
+ "value": "BI9QNW6V9W3XFJK4R02D"
+ },
+ "uri": "https://server.example.com/continue",
+ "wait": 60
+ }
+ }
+
+ Note that the continuation access token value has been rotated since
+ it was used by the client instance to make this call. The client
+ instance polls the continuation URI after a 60-second timeout using
+ the new token.
+
+ POST /continue HTTP/1.1
+ Host: server.example.com
+ Authorization: GNAP BI9QNW6V9W3XFJK4R02D
+ Signature-Input: sig1=...
+ Signature: sig1=...
+
+ The AS retrieves the pending request based on the handle, determines
+ that it has been approved, and issues an access token.
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ HTTP/1.1 200 OK
+ Content-Type: application/json
+ Cache-Control: no-store
+
+ {
+ "access_token": {
+ "value": "OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0",
+ "manage": "https://server.example.com/token/PRY5NM33O\
+ M4TB8N6BW7OZB8CDFONP219RP1L",
+ "access": [
+ "dolphin-metadata", "some other thing"
+ ]
+ }
+ }
+
+B.5. Applying OAuth 2.0 Scopes and Client IDs
+
+ While GNAP is not designed to be directly compatible with OAuth 2.0
+ [RFC6749], considerations have been made to enable the use of OAuth
+ 2.0 concepts and constructs more smoothly within GNAP.
+
+ In this scenario, the client developer has a client_id and set of
+ scope values from their OAuth 2.0 system and wants to apply them to
+ the new protocol. In OAuth 2.0, the client developer would put their
+ client_id and scope values as parameters into a redirect request to
+ the authorization endpoint.
+
+ NOTE: '\' line wrapping per RFC 8792
+
+ HTTP 302 Found
+ Location: https://server.example.com/authorize\
+ ?client_id=7C7C4AZ9KHRS6X63AJAO\
+ &scope=read%20write%20dolphin\
+ &redirect_uri=https://client.example.net/return\
+ &response_type=code\
+ &state=123455
+
+ Now the developer wants to make an analogous request to the AS using
+ GNAP. To do so, the client instance makes an HTTP POST and places
+ the OAuth 2.0 values in the appropriate places.
+
+ POST /tx HTTP/1.1
+ Host: server.example.com
+ Content-Type: application/json
+ Signature-Input: sig1=...
+ Signature: sig1=...
+ Content-Digest: sha-256=...
+
+ {
+ "access_token": {
+ "access": [
+ "read", "write", "dolphin"
+ ],
+ "flags": [ "bearer" ]
+ },
+ "client": "7C7C4AZ9KHRS6X63AJAO",
+ "interact": {
+ "start": ["redirect"],
+ "finish": {
+ "method": "redirect",
+ "uri": "https://client.example.net/return?state=123455",
+ "nonce": "LKLTI25DK82FX4T4QFZC"
+ }
+ }
+ }
+
+ The client_id can be used to identify the client instance's keys that
+ it uses for authentication, the scopes represent resources that the
+ client instance is requesting, and the redirect_uri and state value
+ are pre-combined into a finish URI that can be unique per request.
+ The client instance additionally creates a nonce to protect the
+ callback, separate from the state parameter that it has added to its
+ return URI.
+
+ From here, the protocol continues as above.
+
+Appendix C. Interoperability Profiles
+
+ The GNAP specification has many different modes, options, and
+ mechanisms, allowing it to solve a wide variety of problems in a wide
+ variety of deployments. The wide applicability of GNAP makes it
+ difficult, if not impossible, to define a set of mandatory-to-
+ implement features, since one environment's required feature would be
+ impossible to do in another environment. While this is a large
+ problem in many systems, GNAP's back-and-forth negotiation process
+ allows parties to declare at runtime everything that they support and
+ then have the other party select from that the subset of items that
+ they also support, leading to functional compatibility in many parts
+ of the protocol even in an open world scenario.
+
+ In addition, GNAP defines a set of interoperability profiles that
+ gather together core requirements to fix options into common
+ configurations that are likely to be useful to large populations of
+ similar applications.
+
+ Conformant AS implementations of these profiles MUST implement at
+ least the features as specified in the profile and MAY implement
+ additional features or profiles. Conformant client implementations
+ of these profiles MUST implement at least the features as specified,
+ except where a subset of the features allows the protocol to function
+ (such as using polling instead of a push finish method for the
+ Secondary Device profile).
+
+C.1. Web-Based Redirection
+
+ Implementations conformant to the web-based redirection profile of
+ GNAP MUST implement all of the following features:
+
+ * Interaction Start Methods: redirect
+
+ * Interaction Finish Methods: redirect
+
+ * Interaction Hash Algorithms: sha-256
+
+ * Key Proofing Methods: httpsig with no additional parameters
+
+ * Key Formats: jwks with signature algorithm included in the key's
+ alg parameter
+
+ * JOSE Signature Algorithm: PS256
+
+ * Subject Identifier Formats: opaque
+
+ * Assertion Formats: id_token
+
+C.2. Secondary Device
+
+ Implementations conformant to the Secondary Device profile of GNAP
+ MUST implement all of the following features:
+
+ * Interaction Start Methods: user_code and user_code_uri
+
+ * Interaction Finish Methods: push
+
+ * Interaction Hash Algorithms: sha-256
+
+ * Key Proofing Methods: httpsig with no additional parameters
+
+ * Key Formats: jwks with signature algorithm included in the key's
+ alg parameter
+
+ * JOSE Signature Algorithm: PS256
+
+ * Subject Identifier Formats: opaque
+
+ * Assertion Formats: id_token
+
+Appendix D. Guidance for Extensions
+
+ Extensions to this specification have a variety of places to alter
+ the protocol, including many fields and objects that can have
+ additional values in a registry (Section 10) established by this
+ specification. For interoperability and to preserve the security of
+ the protocol, extensions should register new values with IANA by
+ following the specified mechanism. While it may technically be
+ possible to extend the protocol by adding elements to JSON objects
+ that are not governed by an IANA registry, a recipient may ignore
+ such values but is also allowed to reject them.
+
+ Most object fields in GNAP are specified with types, and those types
+ can allow different but related behavior. For example, the access
+ array can include either strings or objects, as discussed in
+ Section 8. The use of JSON polymorphism (Appendix E) within GNAP
+ allows extensions to define new fields by not only choosing a new
+ name but also by using an existing name with a new type. However,
+ the extension's definition of a new type for a field needs to fit the
+ same kind of item being extended. For example, a hypothetical
+ extension could define a string value for the access_token request
+ field, with a URL to download a hosted access token request. Such an
+ extension would be appropriate as the access_token field still
+ defines the access tokens being requested. However, if an extension
+ were to define a string value for the access_token request field,
+ with the value instead being something unrelated to the access token
+ request such as a value or key format, this would not be an
+ appropriate means of extension. (Note that this specific extension
+ example would create another form of SSRF attack surface as discussed
+ in Section 11.34.)
+
+ As another example, both interaction start modes (Section 2.5.1) and
+ key proofing methods (Section 7.3) can be defined as either strings
+ or objects. An extension could take a method defined as a string,
+ such as app, and define an object-based version with additional
+ parameters. This extension should still define a method to launch an
+ application on the end user's device, just like app does when
+ specified as a string.
+
+ Additionally, the ability to deal with different types for a field is
+ not expected to be equal between an AS and client software, with the
+ client software being assumed to be both more varied and more
+ simplified than the AS. Furthermore, the nature of the negotiation
+ process in GNAP allows the AS more chance of recovery from unknown
+ situations and parameters. As such, any extensions that change the
+ type of any field returned to a client instance should only do so
+ when the client instance has indicated specific support for that
+ extension through some kind of request parameter.
+
+Appendix E. JSON Structures and Polymorphism
+
+ GNAP makes use of polymorphism within the JSON [RFC8259] structures
+ used for the protocol. Each portion of this protocol is defined in
+ terms of the JSON data type that its values can take, whether it's a
+ string, object, array, boolean, or number. For some fields,
+ different data types offer different descriptive capabilities and are
+ used in different situations for the same field. Each data type
+ provides a different syntax to express the same underlying semantic
+ protocol element, which allows for optimization and simplification in
+ many common cases.
+
+ Even though JSON is often used to describe strongly typed structures,
+ JSON on its own is naturally polymorphic. In JSON, the named members
+ of an object have no type associated with them, and any data type can
+ be used as the value for any member. In practice, each member has a
+ semantic type that needs to make sense to the parties creating and
+ consuming the object. Within this protocol, each object member is
+ defined in terms of its semantic content, and this semantic content
+ might have expressions in different concrete data types for different
+ specific purposes. Since each object member has exactly one value in
+ JSON, each data type for an object member field is naturally mutually
+ exclusive with other data types within a single JSON object.
+
+ For example, a resource request for a single access token is composed
+ of an object of resource request descriptions, while a request for
+ multiple access tokens is composed of an array whose member values
+ are all objects. Both of these represent requests for access, but
+ the difference in syntax allows the client instance and AS to
+ differentiate between the two request types in the same request.
+
+ Another form of polymorphism in JSON comes from the fact that the
+ values within JSON arrays need not all be of the same JSON data type.
+ However, within this protocol, each element within the array needs to
+ be of the same kind of semantic element for the collection to make
+ sense, even when the data types are different from each other.
+
+ For example, each aspect of a resource request can be described using
+ an object with multiple dimensional components, or the aspect can be
+ requested using a string. In both cases, the resource request is
+ being described in a way that the AS needs to interpret, but with
+ different levels of specificity and complexity for the client
+ instance to deal with. An API designer can provide a set of common
+ access scopes as simple strings but still allow client software
+ developers to specify custom access when needed for more complex
+ APIs.
+
+ Extensions to this specification can use different data types for
+ defined fields, but each extension needs to not only declare what the
+ data type means but also provide justification for the data type
+ representing the same basic kind of thing it extends. For example,
+ an extension declaring an "array" representation for a field would
+ need to explain how the array represents something akin to the non-
+ array element that it is replacing. See additional discussion in
+ Appendix D.
+
+Acknowledgements
+
+ The authors would like to thank the following individuals for their
+ reviews, implementations, and contributions: Åke Axeland, Aaron
+ Parecki, Adam Omar Oueidat, Andrii Deinega, Annabelle Backman, Dick
+ Hardt, Dmitri Zagidulin, Dmitry Barinov, Florian Helmschmidt, Francis
+ Pouatcha, George Fletcher, Haardik Haardik, Hamid Massaoud, Jacky
+ Yuan, Joseph Heenan, Kathleen Moriarty, Leif Johansson, Mike Jones,
+ Mike Varley, Nat Sakimura, Takahiko Kawasaki, Takahiro Tsuchiya, and
+ Yaron Sheffer.
+
+ The authors would also like to thank the GNAP Working Group design
+ team (Kathleen Moriarty, Dick Hardt, Mike Jones, and the authors),
+ who incorporated elements from the XAuth and XYZ proposals to create
+ the first draft version of this document.
+
+ In addition, the authors would like to thank Aaron Parecki and Mike
+ Jones for insights into how to integrate identity and authentication
+ systems into the core protocol. Both Justin Richer and Dick Hardt
+ developed the use cases, diagrams, and insights provided in the XYZ
+ and XAuth proposals that have been incorporated here. The authors
+ would like to especially thank Mike Varley and the team at SecureKey
+ for feedback and development of early versions of the XYZ protocol
+ that fed into this standards work.
+
+ Finally, the authors want to acknowledge the immense contributions of
+ Aaron Parecki to the content of this document. We thank him for his
+ insight, input, and hard work, without which GNAP would not have
+ grown to what it is.
+
+Authors' Addresses
+
+ Justin Richer (editor)
+ Bespoke Engineering
+ Email: ietf@justin.richer.org
+ URI: https://bspk.io/
+
+
+ Fabien Imbault
+ acert.io
+ Email: fabien.imbault@acert.io
+ URI: https://acert.io/