<?xml version="1.0" encoding="US-ASCII"?>
<?xml-stylesheet type='text/xsl' href='http://xml2rfc.tools.ietf.org/authoring/rfc2629.xslt' ?>
<!DOCTYPE rfc PUBLIC "-//IETF//DTD RFC 2629//EN" "http://xml2rfc.tools.ietf.org/authoring/rfc2629.dtd">
<!--
  NOTE:  This XML file is input used to produce the authoritative copy of an
  OpenID Foundation specification.  The authoritative copy is the HTML output.
  This XML source file is not authoritative.  The statement ipr="none" is
  present only to satisfy the document compilation tool and is not indicative
  of the IPR status of this specification.  The IPR for this specification is
  described in the "Notices" section.  This is a public OpenID Foundation
  document and not a private document, as the private="..." declaration could
  be taken to indicate.
-->
<rfc category="std" docName="draft-oidc-connect-nativesso-03" ipr="none">

  <?rfc toc="yes" ?>
  <?rfc tocdepth="5" ?>
  <?rfc symrefs="yes" ?>
  <?rfc sortrefs="yes"?>
  <?rfc strict="yes" ?>
  <?rfc iprnotified="no" ?>
  <?rfc private="Draft" ?>

  <front>
    <title abbrev="OpenID Connect Native SSO for Mobile Apps 1.0">OpenID Connect
    Native SSO for Mobile Apps 1.0 - draft 03</title>

    <author fullname="George F. Fletcher" initials="G.F.F." surname="Fletcher">
      <organization abbrev="Verizon Media">Verizon Media Group</organization>
      <address>
        <email>george.fletcher@verizonmedia.com</email>
      </address>
    </author>

    <date day="3" month="July" year="2019" />

    <workgroup>OpenID Connect Working Group</workgroup>

    <abstract>
      <t>OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0
      protocol. It enables Clients to verify the identity of the End-User based
      on the authentication performed by an Authorization Server, as well as to
      obtain basic profile information about the End-User in an interoperable and
      REST-like manner.</t>

      <t>
		  This document describes a mechanism that allows a mobile
		  app to share the identity/authentication obtained by a different mobile
		  app where both apps are issued by the same vendor.
      </t>
    </abstract>
  </front>

  <middle>
    <section anchor="Introduction" title="Introduction">

      <t>
	OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0
	<xref target="RFC6749"/>
	protocol. It enables Clients to verify the identity of the End-User based
	on the authentication performed by an Authorization Server, as well as to
	obtain basic profile information about the End-User in an interoperable and
	REST-like manner.
      </t>
      <t>
		  As the industry moves to a more mobile oriented environment, vendors
		  need a way to share identity across the multiple mobile apps they
		  deploy. While the current OAuth2 best practice allows for SSO across
		  any mobile app by sharing the session cookies in the system browser,
		  this has risks such as a user clearing their system browser of cookies
		  (possibly as requested by a customer care agent) or using private
		  browsing on iOS and Android. On most mobile platforms, mobile apps
		  signed by the same vendor certs can share information via the system
		  "keychain" (Account Manager on Android).
      </t>
      <t>
		  This document specifies a new scope, extends the token endpoint and
		  profiles the <xref target="OAuth2.TokenExchange">OAuth2 token
		  exchange</xref> spec allowing mobile apps to share identity (SSO)
		  between apps produced and signed by the same vendor (i.e. signed with
		  the same vendor certificate).
      </t>

      <section anchor="rnc" title="Requirements Notation and Conventions">
        <t>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 <xref
        target="RFC2119">RFC 2119</xref>.</t>

	<t>
	  In the .txt version of this specification,
	  values are quoted to indicate that they are to be taken literally.
	  When using these values in protocol messages,
	  the quotes MUST NOT be used as part of the value.
	  In the HTML version of this specification,
	  values to be taken literally are indicated by
	  the use of <spanx style="verb">this fixed-width font</spanx>.
	</t>
      </section>

      <section anchor="Terminology" title="Terminology">
        <t>
	  This specification uses the terms
	  "Authorization Server",
	  "Client", "Client Identifier",
	  and "Redirection URI"
	  defined by <xref target="RFC6749">OAuth 2.0</xref>,
	  the term "User Agent" defined by <xref target="RFC7230">RFC 7230</xref>,
			the term "native app" defined by <xref target="RFC8252">RFC 8252</xref>
	  and the terms defined by
	  <xref target="OpenID.Core">OpenID Connect Core 1.0</xref>.
	</t>
	<t>
	  This specification also defines the following terms:
	  <list style="hanging">

	    <t hangText="Device Secret">
	      <vspace/>
	      Opaque value to the client, issued by the Authorization
			Server, that uniquely identifies the device instance
			and provides credentials for the device.
	    </t>

	    <t hangText="Session ID">
	      <vspace/>
	      Identifier for a Session.
	    </t>

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

    <section anchor="AbstractFlow" title="Abstract Flow">
		<figure>
			<artwork><![CDATA[
+----------+     +----------+      +-----------+      +------------+
|  Native  |     |  Native  |      |  System   |      |            |
|  App     |     |  App     |      |  Browser  |      |    AS      |
|  #1      |     |  #2      |      |           |      |            |
+----+-----+     +----+-----+      +-----+-----+      +-----+------+
     |                |                  |                  |
     | [1] Start OIDC AuthN              |                  |
     +----------------+----------------> |                  |
     |                |                  | [2] /authorize   |
     |                |                  +----------------> |
     |                |                  |                  |
     |                |                  |   [3] authenticate
     |                |                  | <----------------|
     |                |                  |                  |
     |                |                  | [4] user creds   |
     |                |                  +----------------> |
     |                |                  |                  |
     |                |                  |  [5] callback    |
     |                |                  | <----------------+
     |  [6] callback with code           |                  |
     | <--------------+------------------+                  |
     |                |                  |                  |
     |  [7] exchange code for tokens     |                  |
     +----------------+-----------------------------------> |
     |                |                  |                  |
     |     [8] tokens (including device_secret)             |
     | <--------------+------------------+------------------+
     |                |                  |                  |
     |                |                  |                  |
     |                |                  |                  |
     +                +                  +                  +

			]]></artwork>
		</figure>
		<t>Steps [1] - [8] are the standard OpenID Connect authorization_code
			flow with the following extensions. In step 2, the
			<spanx style="verb">device_sso</spanx>
			scope is specified signifying that the client is requesting a
			<spanx style="verb">device_secret</spanx> to be returned when
			the code is exchanged for tokens.</t>
		<figure>
			<artwork><![CDATA[
+----------+     +----------+      +-----------+      +------------+
|  Native  |     |  Native  |      |  System   |      |            |
|  App     |     |  App     |      |  Browser  |      |    AS      |
|  #1      |     |  #2      |      |           |      |            |
+----+-----+     +----+-----+      +-----+-----+      +-----+------+
     |                |                  |                  |
     |                |                  |                  |
     |                | [9] token exchange                  |
     |                +------------------+----------------> |
     |                |                  |                  |
     |                |                  |                  |
     |                |    [10] refresh, access, [device_secret]
     |                | <----------------+------------------|
     |                |                  |                  |
     |                |                  |                  |
     |                |                  |                  |
     +                +                  +                  +

			]]></artwork>
		</figure>
		<t>Step [9] invokes the /token endpoint with the token exchange profile
			passing the id_token obtained from the shared device storage, the
			client_id and the device secret.</t>
		<t>Step [10] returns the SSO generated refresh and access tokens for
			Native App #2.</t>
	</section>

	  <section anchor="AuthZExtensions" title="Native App Authorization Extensions">
      <t>
		  The following sections describe the extensions required to the standard OIDC
		  Authentication flow which will enable a second mobile app to share the
		  authentication of the first mobile app where both mobile applications are
		  signed by the same vendor certificates.
      </t>
		  <section anchor="AuthZReq" title="Authorization Request">
			  <t>This specification defines a new scope value that is used to convey
				  to the Authorization Server that when the code is exchanged for a
				  token, a new <spanx style="verb">device_secret</spanx> will be
				  returned in addition to the other tokens identified as part of the
				  authorization request.</t>
			  <t>The new scope value is defined as <spanx style="verb">device_sso</spanx>.
				  When this scope is present on the authorization request, when the
				  code is exchanged for tokens, a new device_secret will be returned.</t>
		  </section>
		  <section anchor="DeviceSecret" title="Device Secret">
			  <t>The device secret contains relevant data to the device and the
				  current users authenticated with the device. The device secret
				  is completely opaque to the client and as such the AS MUST
          adequately protect the value such as using a JWE if the AS
          is not maintaining state on the backend.</t>
			  <t>In the context of this extension the device secret may be shared
				  between mobile apps that can obtain the value via the shared
				  security mechanism (e.g. keychain on iOS). If a mobile app
				  requests a device secret via the <spanx style="verb">device_sso</spanx>
				  scope and a <spanx style="verb">device_secret</spanx> exists, then
				  the client MUST provide the <spanx style="verb">device_secret</spanx>
				  on the request to the /token endpoint to exchange
				  code for tokens. The client SHOULD provide the
				  <spanx style="verb">device_secret</spanx> to the /token endpoint
				  during refresh token requests so that the AS may rotate the
          device_secert as necessary.</t>
			  <t>The exact construction of the <spanx style="verb">device_secret</spanx>
				  is out of scope for this specification.</t>
		  </section>
		  <section anchor="TokenReq" title="Token Request">
			  <t>During a normal user authentication via the system browser, after
				  the mobile app receives the code and state response from the
				  Authorization Server, this spec defines the following additional
				  parameters to the /token endpoint for the authorization_code grant_type.
				  <list style="hanging">

					  <t hangText="device_secret">
						  <vspace/>
						  OPTIONAL. This token SHOULD be provided if the client requested
						  the <spanx style="verb">device_sso</spanx> scope and the client
						  already has a <spanx style="verb">device_secret</spanx>
						  available. If no <spanx style="verb">device_secret</spanx> is
						  specified and the refresh_token contains the
						  <spanx style="verb">device_sso</spanx> scope, a new
						  <spanx style="verb">device_secret</spanx> will be generated.
					  </t>

				  </list>
			  </t>
		  </section>
		  <section anchor="TokenRsp" title="Token Response">
			  <t>When the authorization server receives the
				  <spanx style="verv">device_secret</spanx> value it MUST
				  process the authorization_code grant type per the OIDC spec with the
				  following additions applying to the id_token.
				  <list style="numbers">
					  <t>Add a ?ds_hash? claim to the id_token to represent a function of
						  the device_secret.
						  <list style="hanging">
							  <t hangText="ds_hash">
								  <vspace/>
								  REQUIRED. The ds_hash value provides a binding between
								  the id_token and the issued device_secret. The exact
								  binding between the ds_hash and device_secret is not
								  specified by this profile. As this binding is managed
								  solely by the Authorization Server, the AS can choose
								  how to protect the relationship between the id_token
								  and device_secret.
							  </t>
						  </list>
					  </t>
					  <t>Add a session id to the id_token that represents the user?s
						  current authentication session.
						  <list style="hanging">
							  <t hangText="sid">
								  <vspace/>
								  REQUIRED. A string that uniquely identifies this user?s
								  authentication ?session?. This value can be used in
								  logout flows as well as the flow this spec is describing.
								  For mobile apps where there is no explicit ?browser
								  authentication? this value SHOULD represent the
								  underlying session associated with the refresh_token.
							  </t>
						  </list>
					  </t>
				  </list>
			  </t>
			  <t>Note that the implementation of this spec and the specification of the
				  ds_hash and sid value MUST NOT leak any data that would provide a
				  security advantage to an attacker who gains access to the id_token.</t>
			  <t>When the authorization server receives the device_secret it must
				  validate the token. If the token is invalid it must be discarded and
				  the request processed as if no device_secret was specified.</t>
			  <t>If the authorization request included the device_sso scope then the
				  authorization server MUST return a device_secret in the response.
				  The device_secret is returned in the ?device_token? claim of the
				  returned JSON data.</t>
			  <t>If no devices_secret is specified, then the AS MUST generate the
				  token. If a device_secret is specified and is valid, the AS MAY
				  update the device_secret as necessary. Regardless a device_secret
                  must be returned in the response.</t>
		  </section>
    </section>

	  <section anchor="NativeSSOTX" title="Token Exchange Profile for Native SSO">
		  <t>This section profiles the
			  <xref target="OAuth2.TokenExchange">OAuth2 Token Exchange</xref> spec and
			  describes the processing rules used to exchange a previous authentication
			  for new refresh and access tokens requested by a mobile app created by
			  the same vendor as the first mobile app and both apps signed by the
			  same developer certificate.</t>
		  <section anchor="TXProfile" title="OAuth2 Token Exchange Profile">
			  <t>The client authenticates using its registered token endpoint
          endpoint client authentication method. This could range from HTTP
          Basic Authentication, to OIDC defined private_key_jwt. The AS must
          be able to obtain the client_id of the requesting mobile app
          (mobile app #2) from the client authentication method.
        </t>
			  <t>This profile defines the use of the following token exchange parameters.
				  <list style="hanging">
					  <t hangText="grant_type">
						  <vspace/>
						  REQUIRED. The value MUST be urn:ietf:params:oauth:grant-type:token-exchange
					  </t>
					  <t hangText="audience">
						  <vspace/>
						  REQUIRED. This parameter defines the logical purview of the returned tokens.
						  For the purposes of this profile, this value MUST be the issuer URI for
						  the OpenID Provider that issued the id_token used in this profile.
					  </t>
					  <t hangText="subject_token">
						  <vspace/>
						  REQUIRED. This parameter MUST contain the id_token obtained by the first
						  native app. The id_token is used in the same manner as id_token_hint to
						  identify the user to SSO into the invoking native app.
					  </t>
					  <t hangText="subject_token_type">
						  <vspace/>
						  REQUIRED. This parameter MUST contain the
						  value: urn:ietf:params:oauth:token-type:id_token
					  </t>
					  <t hangText="actor_token">
						  <vspace/>
						  REQUIRED. This value defines the actor making the request which in this
						  case is the device_secret issued to the device of the native
						  application making the request. The device_secret MUST be presented per
						  the definition of the urn:x-oath:params:oauth:token-type:device-secret
						  token identifier described below.
					  </t>
					  <t hangText="actor_token_type">
						  <vspace/>
						  REQUIRED. This value MUST be: urn:x-oath:params:oauth:token-type:device-secret
					  </t>
					  <t hangText="scope">
						  <vspace/>
						  OPTIONAL. The scopes required by the requesting native application.
					  </t>
					  <t hangText="requested_token_type">
						  <vspace/>
						  OPTIONAL. The desired token(s) to be returned. If no requested_token_type
                          is defined, it is up to the AS to return the appropriate tokens for the
                          requesting client. The full set of possible requested_token_type value
                          is out of scope for this specification.
					  </t>
				  </list>
			  </t>
			  <t>This profile also defines the following token type identifiers.
				  <list style="hanging">
				  <t hangText="urn:x-oath:params:oauth:token-type:device-secret">
					  <vspace/>
					  This token type identifier is used to describe the device_secret specified
					  in the actor_token parameter.
				  </t>
				  </list>
			  </t>
		  </section>
		  <section anchor="TXReq" title="Token Exchange Request">
			  <t>When a mobile app wants to request ?native SSO? (i.e. obtain refresh and access
				  tokens for an already signed in user) it makes a standard OAuth2 /token
				  endpoint request following the profile for Token Exchange defined above.</t>
        <t>The following is a non-normative example</t>
			  <figure><artwork><![CDATA[
    POST /token HTTP/1.1
    Host: as.example.com
    Authorization: Basic ZGZhZGYyMzUyNDU0Og
    ...
    grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
    &audience=https%3A%3F%3Flogin.example.net&subject_token=<id_token>
    &subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aid-token
    &actor_token=95twdf3w4y6wvftw35634t
    &actor_token_type=urn%3Ax-oath%3Aparams%3Aoauth%3Atoken-type%3Adevice-secret
              ]]></artwork></figure>
			  <t>The client_id in this request is sent via the HTTP Basic Authentication
				  method using the HTTP Authorization header.</t>
		  </section>
		  <section anchor="TXRules" title="Native SSO Processing Rules">
			  <t>When the authorization server receives a request at the token endpoint
				  conforming to this profile it MUST perform the following checks before
				  issuing any tokens.
				  <list style="numbers">
					  <t>Validate the device_secret to ensure the token is still valid. The
						  format of this secret is defined by the Authorization server and
						  is out of scope for this specification.</t>
					  <t>Verify that the binding between the id_token and the device_secret
						  (as defined in the extension to the /token response) is valid.</t>
					  <t>Verify that the session id in the id_token (?sid? claim) is still
						  valid. If the session is no longer valid, the AS MUST return an
						  error of ?invalid_grant?. Note that in the case of a refresh_tokens
              issued with an offline_scope the 'sid' value SHOULD represent the
              offline "session" such that if the original refresh_token is revoked
              the 'ds_hash' value in the id_token is not longer valid.
            </t>
					  <t>Validate that the client requesting native SSO is authorized to
						  do so. The AS SHOULD maintain a list of client_ids that can share
						  user authentications. For example, the AS MAY take the ?aud?
						  claim from the id_token and the client_id from the token request
						  and ensures that both client_ids are allowed to share user
						  authentications.</t>
					  <t>The AS SHOULD verify that the scopes requested by the client in
						  the token request (either default scopes or explicitly specified
						  in the optional ?scope? parameter) do NOT require explicit user
						  consent. If any requested scopes require explicit user consent
						  the AS SHOULD fail the request and return an error of
						  ?invalid_scope?.</t>
				  </list>
			  </t>
			  <t>Based on the AS definition of the device_secret, the AS may perform
				  addition checks to ensure the security of the request. Provided the
				  above criteria is met, the AS will issue a normal Token Response
				  object containing a refresh_token, access_token and id_token issued
				  to the client_id of the mobile app making the request. The session
				  associated with the new refresh_token SHOULD be the same as that
				  used to verify the validity of the SSO exchange. If that session
				  expires, all refresh_tokens associated with it MUST be invalidated.</t>
		  </section>
		  <section anchor="TXRsp" title="Token Exchange Response">
			  <t>The Token Exchange response for this profile has the following characteristics:
				  <list style="hanging">
					  <t hangText="access_token">
						  <vspace/>
						  REQUIRED. This response field contains the access token issued to
						  the mobile client identified by the client_id sent in the
						  Authorization header.
					  </t>
					  <t hangText="issued_token_type">
						  <vspace/>
						  REQUIRED. This value of this parameter MUST be:
						  urn:ietf:params:oauth:token-type:access_token
					  </t>
					  <t hangText="token_type">
						  <vspace/>
						  REQUIRED. The value of this parameter MUST be
						  <spanx style="verb">bearer</spanx>.
					  </t>
					  <t hangText="expires_in">
						  <vspace/>
						  RECOMMENDED. Identifies when the access_token expires.
					  </t>
					  <t hangText="scope">
						  <vspace/>
						  OPTIONAL. Follows the token exchange spec definition.
					  </t>
					  <t hangText="refresh_token">
						  <vspace/>
						  OPTIONAL. By default the AS should return a refresh_token that
                          the mobile app can use to obtain additional access_tokens when
                          the access_token expires.
					  </t>
					  <t hangText="id_token">
						  <vspace/>
						  OPTIONAL. By default the AS should return an id_token that provides
                          the mobile app with an identity assertion about the user.
					  </t>
                      <t hangText="device_secret">
						  <vspace/>
						  OPTIONAL. The AS MAY return an updated
						  device_secret in the response.
					  </t>
				  </list>
			  </t>
			  <t>In the case of any errors, the AS MUST return a valid OAuth2 Error response
				  as described in Section 2.2.2 of the Token Exchange spec.</t>
        <t>The following is a non-normative example</t>
			  <figure><artwork><![CDATA[
    HTTP/1.1 200 OK
    Content-Type: application/json;charset=UTF-8
    Cache-Control: no-store
    Pragma: no-cache

    {
      "access_token":"2YotnFZFEjr1zCsicMWpAA",
      "issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
      "token_type":"Bearer",
      "expires_in":3600,
      "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
      "id_token":"<id_token>",
      "device_secret":"casdfgarfgasdfg"
    }
              ]]></artwork></figure>
		  </section>
	  </section>


    <section anchor="Security" title="Security Considerations">
      <t>
		  Sufficient care must be made to protect the <spanx style="verb">device_secret</spanx>.
		  The device secret SHOULD be encrypted by the Authorization Service and periodically
		  refreshed via the mechanisms described in this specification.
      </t>
    </section>

  </middle>

  <back>
    <references title="Normative References">
      <?rfc include="http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119"?>
      <?rfc include="http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3986"?>
      <?rfc include="http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6749"?>
      <?rfc include="http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7230"?>
		<?rfc include="http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8252"?>

		<reference anchor="OAuth2.TokenExchange" target="https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-14">
			<front>
				<title>OAuth 2.0 Token Exchange</title>
				<author fullname="Brian Campbell" initials="B." surname="Campbell">
					<organization abbrev="Ping Identity">Ping Identity</organization>
				</author>
				<date day="4" month="June" year="2018"/>
			</front>
		</reference>

      <reference anchor="OpenID.Core" target="http://openid.net/specs/openid-connect-core-1_0.html">
        <front>
          <title>OpenID Connect Core 1.0</title>

          <author fullname="Nat Sakimura" initials="N." surname="Sakimura">
            <organization abbrev="NRI">Nomura Research Institute, Ltd.</organization>
          </author>

          <author fullname="John Bradley" initials="J." surname="Bradley">
            <organization abbrev="Ping Identity">Ping Identity</organization>
          </author>

          <author fullname="Michael B. Jones" initials="M.B." surname="Jones">
            <organization abbrev="Microsoft">Microsoft</organization>
          </author>

          <author fullname="Breno de Medeiros" initials="B." surname="de Medeiros">
            <organization abbrev="Google">Google</organization>
          </author>

	  <author fullname="Chuck Mortimore" initials="C." surname="Mortimore">
	    <organization abbrev="Salesforce">Salesforce</organization>
	  </author>

          <date day="8" month="November" year="2014"/>
        </front>
      </reference>

      <reference anchor="OpenID.Discovery" target="http://openid.net/specs/openid-connect-discovery-1_0.html">
        <front>
          <title>OpenID Connect Discovery 1.0</title>

          <author fullname="Nat Sakimura" initials="N." surname="Sakimura">
            <organization abbrev="NRI">Nomura Research Institute, Ltd.</organization>
          </author>

          <author fullname="John Bradley" initials="J." surname="Bradley">
            <organization abbrev="Ping Identity">Ping Identity</organization>
          </author>

          <author fullname="Michael B. Jones" initials="M.B." surname="Jones">
            <organization abbrev="Microsoft">Microsoft</organization>
          </author>

          <author fullname="Edmund Jay" initials="E." surname="Jay">
            <organization abbrev="Illumila">Illumila</organization>
          </author>

          <date day="8" month="November" year="2014"/>
        </front>
      </reference>

      <reference anchor="OpenID.Registration" target="http://openid.net/specs/openid-connect-registration-1_0.html">
        <front>
          <title>OpenID Connect Dynamic Client Registration 1.0</title>

          <author fullname="Nat Sakimura" initials="N." surname="Sakimura">
            <organization abbrev="NRI">Nomura Research Institute, Ltd.</organization>
          </author>

          <author fullname="John Bradley" initials="J." surname="Bradley">
            <organization abbrev="Ping Identity">Ping Identity</organization>
          </author>

          <author fullname="Michael B. Jones" initials="M.B." surname="Jones">
            <organization abbrev="Microsoft">Microsoft</organization>
          </author>

          <date day="8" month="November" year="2014"/>
        </front>
      </reference>

      <reference anchor="OpenID.Session" target="http://openid.net/specs/openid-connect-session-1_0.html">
	<front>
	  <title>OpenID Connect Session Management 1.0</title>

	  <author fullname="Nat Sakimura" initials="N." surname="Sakimura">
	    <organization abbrev="NRI">Nomura Research Institute, Ltd.</organization>
	  </author>

	  <author fullname="John Bradley" initials="J." surname="Bradley">
	    <organization abbrev="Ping Identity">Ping Identity</organization>
	  </author>

	  <author fullname="Michael B. Jones" initials="M.B." surname="Jones">
	    <organization abbrev="Microsoft">Microsoft</organization>
	  </author>

	  <author fullname="Breno de Medeiros" initials="B." surname="de Medeiros">
	    <organization abbrev="Google">Google</organization>
	  </author>

	  <author fullname="Chuck Mortimore" initials="C." surname="Mortimore">
	    <organization abbrev="Salesforce">Salesforce</organization>
	  </author>

	  <author fullname="Edmund Jay" initials="E." surname="Jay">
	    <organization abbrev="Illumila">Illumila</organization>
	  </author>

	  <date day="25" month="January" year="2017" />
	</front>
      </reference>

      <reference anchor="OpenID.BackChannel" target="http://openid.net/specs/openid-connect-backchannel-1_0.html">
	<front>
	  <title>OpenID Connect Back-Channel Logout 1.0</title>

	  <author fullname="Michael B. Jones" initials="M.B." surname="Jones">
	    <organization abbrev="Microsoft">Microsoft</organization>
	  </author>

          <author fullname="John Bradley" initials="J." surname="Bradley">
            <organization abbrev="Ping Identity">Ping Identity</organization>
          </author>

	  <date day="25" month="January" year="2017" />
	</front>
      </reference>

      <reference anchor="IANA.JWT.Claims" target="http://www.iana.org/assignments/jwt">
        <front>
          <title>JSON Web Token Claims</title>
          <author>
            <organization>IANA</organization>
          </author>
	  <date/>
        </front>
      </reference>

      <reference anchor="IANA.OAuth.Parameters" target="http://www.iana.org/assignments/oauth-parameters">
        <front>
          <title>OAuth Parameters</title>
          <author>
            <organization>IANA</organization>
          </author>
	  <date/>
        </front>
      </reference>

    </references>

    <references title="Informative References">
      <?rfc include="http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7591"?>

      <reference anchor="JWT" target="http://tools.ietf.org/html/rfc7519">
	<front>
	  <title>JSON Web Token (JWT)</title>

	  <author fullname="Michael B. Jones" initials="M.B." surname="Jones">
	    <organization abbrev="Microsoft">Microsoft</organization>
	  </author>

	  <author fullname="John Bradley" initials="J." surname="Bradley">
	    <organization abbrev="Ping Identity">Ping Identity</organization>
	  </author>

	  <author fullname="Nat Sakimura" initials="N." surname="Sakimura">
	    <organization abbrev="NRI">Nomura Research Institute, Ltd.</organization>
	  </author>

	  <date month="May" year="2015" />
	</front>

	<seriesInfo name="RFC" value="7519"/>
	<seriesInfo name="DOI" value="10.17487/RFC7519"/>
      </reference>

    </references>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>
	The OpenID Community would like to thank the following people for
	their contributions to this specification:
      </t>
      <t>
        <list style="empty">
          <t>Nat Sakimura, Nomura Reserach Institute, Ltd.</t>
          <t>Nov Matake</t>
          <t>Filip Skokan</t>
        </list>
      </t>
    </section>

    <section anchor="History" title="Document History">
      <t>[[ To be removed from the final specification ]]</t>

      <t>
	-00
	<list style="symbols">
          <t>
	    Initial Draft.
	  </t>
      <t>
      Draft-03 - Applied updates from the community. Removed non-relevant IANA claims section.
      </t>
        </list>
      </t>
    </section>
  </back>
</rfc>
