<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc category="exp" docName="draft-bradley-oauth-stateless-client-id-03" ipr="trust200902">
  <front>
    <title abbrev="Abbreviated-Title">Stateless Client Identifier for OAuth
    2</title>

    <author fullname="John Bradley" initials="J." role="editor" surname="Bradley">
                  <organization abbrev="Ping">Ping Identity</organization>
      <address>
	<email>ve7jtb@ve7jtb.com</email>
	<uri>http://www.thread-safe.com/</uri>
      </address>
      
    </author>


    <author fullname="Justin Richer" initials="J." surname="Richer">
      <organization/>

      <address>
        <postal>
          <street/>

          <city/>

          <region/>

          <code/>

          <country/>
        </postal>

        <phone/>

        <facsimile/>

        <email/>

        <uri/>
      </address>
    </author>

    <date day="18" month="July" year="2016"/>

    <abstract>
      <t>This draft provides a method for communicating information about an
      OAuth client through its client identifier allowing for fully stateless
      operation.</t>
    </abstract>

    <note title="Requirements Language">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in <xref target="RFC2119">RFC 2119</xref>.</t>
    </note>
  </front>

  <middle>
    <section title="Introduction">
      <t>In the OAuth 2.0 Authorization protocol, the Client must provide a
      Client Identifier that the Authorization Server recognizes.
      Additionally, an Autorization Server needs to know about a client's
      details, such as its name and redirect URIs. Traditionally, this is
      handled through a registration process, which may be either manual or
      automated, where the authorization server maintains a stateful
      relationship between the Client Identifier and its associated metadata.
      This draft proposes a mechanism whereby the essential metadata can be
      encoded into the Client Identifier itself, signed by the issuer, and
      validated by the authorization server, thus allowing the authorization
      server to be stateless in regard to client information.</t>
    </section>

    <section title="Stateless Client Identifier">
      <t>The stateless client identifier consists of a <xref target="RFC7519">JWT</xref>, optionally
      signed with <xref target="RFC7515">JWS</xref>, whose payload contains claims as defined here.</t>

      <t><list style="hanging">
          <t hangText="iss">REQUIRED. URL identifying the party that issued
          this client identifier.</t>

          <t hangText="sub">REQUIRED. Identifier of the client, locally unique
          to the issuer.</t>

 <t hangText="cnf">OPTIONAL. <xref target="RFC7800">JWT Confirmation  claim </xref>
          providing information for the token _endpoint to validate the presenter of the client_id</t>
          
          <t hangText="iat">OPTIONAL. Timestamp of when this client identifier
          was issued.</t>

          <t hangText="exp">OPTIONAL. Timestamp of when this client identifier
          will expire.</t>

          <t hangText="kid">RECOMMENDED if signed. Identifier of the key used
          to sign this client identifier at the issuer.</t>

          <t hangText="reg">REQUIRED. JSON Object containing a set of metadata
          claims of client information such as its redirect URIs, display
          name, and other items as defined in 
          <xref target="RFC7591">Dynamic Client Registration</xref> and its
          extensions.</t>
        </list></t>

      <t>The issuer SHOULD sign the JWT with JWS in such a way that the
      signature can be verified by the authorization server.</t>

      <t>The issuer MAY encrypt the JWT with <xref target="RFC7516">JWE</xref>.</t>
    </section>

    <section title="Validating the Stateless Client Identifier">
      <t>Upon receiving a stateless client identifier at either the
      authorization endpoint or the token endpoint, the authorization server
      parses it as a JWT. It first checks the iss field to determine if it
      trusts identifiers issued by the party represented. It then verifies the
      signature if the JWT (if signed) using JWS. The key used to sign the JWT
      MAY be indicated by the kid field. The authorization server MAY use
      other means to validate the JWT and determine its authenticity.</t>

      <t>The authorization server then reads the fields inside the reg claim
      and uses these to configure the user experience and security parameters
      of the authorization. </t>
    </section>

    <section title="Obtaining a Stateless Client Identifier">
      <t>The client identifier is intended to be opaque to the client, and as
      such a stateless client identifier is intended to be obtained and used
      in exactly the same way as a stateful client identifer would be for any
      OAuth client.</t>

      <t><list style="symbols">
          <t>Manual registration: a developer uses an out-of-band
          adminstrative process to generate the client identifier and related
          credentials.</t>

          <t>Dynamic registration: a developer or client uses the process
          described in [Dyn Reg] to generate the client identifier and related
          credentials.</t>

          <t>Self assertion: a developer or client generates the client
          identifier on their own, often signing it with their own public
          key.</t>
        </list></t>

      <t>It is completely up to the purview of particular authorization
      servers which generation methods, and which client identifiers, they
      will accept.</t>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>[ maybe we register the "reg" claim above? ]</t>

      <t>This document makes no request of IANA.</t>

      <t>Note to RFC Editor: this section may be removed on publication as an
      RFC.</t>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>Since many OAuth systems assume that a change in the client
      identifier indicates a change in the client itself, systems using
      stateless client identifiers SHOULD NOT allow clients to update their
      information post registration. </t>

      <t>Since the client identifier is passed through the browser to the
      authorization endpoint, it MUST NOT contain any sensitive information.
      Additionally, as in standard OAuth, posession of the client identifier
      itself MUST NOT be assumed to be sufficient authentication [in many
      cases? except implicit mode?].</t>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t/>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include="reference.RFC.2119"?>
      <?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7515.xml' ?>
      <?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7516.xml' ?>
      <?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7519.xml' ?>
      <?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7800.xml' ?>
      <?rfc include='http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7591.xml' ?>
    </references>
    
      <section title="Document History" anchor="History">
    <t>
      [[ to be removed by the RFC Editor before publication as an RFC ]]
    </t>
<t>
      -03
      <list style="symbols">
        <t>
          Added reference to RFC7800  and using the cnf claim in a clinet_id (I am thinking that if the dynamic client registration endpoint is on the same host as the token_endpoint, you could use the token binding ID as the cnf method.
        </t>
        
      </list>
    </t>
<t>
      -02
      <list style="symbols">
        <t>
          Added reference to RFC7591 
        </t>
        
      </list>
    </t>
    <t>
      -01
      <list style="symbols">
        <t>
          Added reference to RFC for JOSE
        </t>
        
      </list>
    </t>
    <t>
      -00
      <list style="symbols">
        <t>
          Wrote the first draft.
        </t>

      </list>
    </t>
  </section>

  </back>
</rfc>
