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": "[email protected]"
          }, {
            "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 "[email protected]" for one RO, and a
  different AS could return that same email identifier of
  "[email protected]" 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 ([email protected])

  Intended usage:  COMMON

  Restrictions on usage:  none

  Author:  IETF GNAP Working Group ([email protected])

  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 ([email protected])

  Intended usage:  COMMON

  Restrictions on usage:  none

  Author:  IETF GNAP Working Group ([email protected])

  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 ([email protected])

  Intended usage:  COMMON

  Restrictions on usage:  none

  Author:  IETF GNAP Working Group ([email protected])

  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 ([email protected])

  Intended usage:  COMMON

  Restrictions on usage:  none

  Author:  IETF GNAP Working Group ([email protected])

  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: [email protected]
  URI:   https://bspk.io/


  Fabien Imbault
  acert.io
  Email: [email protected]
  URI:   https://acert.io/