<?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="openid-connect-native-sso-1_0-draft-02" 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 02</title>

    <author fullname="George F. Fletcher" initials="G.F.F." surname="Fletcher">
      <organization abbrev="Oath">Oath</organization>
      <address>
        <email>george.fletcher@oath.com</email>
      </address>
    </author>

    <date day="11" month="June" year="2018" />

    <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 current best practice 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 cert).
      </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 it is RECOMMENDED
				  that the device secret be implemented as a JWE encrypted for
				  the Authorization Server.</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 MAY provide the
				  <spanx style="verb">device_secret</spanx> to the /token endpoint
				  during refresh token requests.</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 identifier.
						  <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 not 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 MUST
				  update the device_secret as necessary.</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 key.</t>
		  <section anchor="TXProfile" title="OAuth2 Token Exchange Profile">
			  <t>The client MUST use the HTTP Basic Authentication method from RFC 6749
				  to authenticate the request to the token endpoint. Note that since
				  the mobile app is using PKCE, the mobile app does not have a secret
				  and will only specify the client_id in the HTTP Authorization header.</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.
					  </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>
			  <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.aol.com&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.</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?.</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 check 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/>
						  REQUIRED. Identifies when the access_token expires.
					  </t>
					  <t hangText="scope">
						  <vspace/>
						  OPTIONAL. Follows the token exchange spec definition.
					  </t>
					  <t hangText="refresh_token">
						  <vspace/>
						  REQUIRED. A refresh_token that the mobile app can use to
						  obtain additional access_tokens when the access_token expires.
					  </t>
					  <t hangText="device_secret">
						  <vspace/>
						  REQUIRED. The AS MUST return either a new or 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>
			  <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",
      "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>

    <section anchor="IANA" title="IANA Considerations">

      <section anchor="ClaimsRegistration" title="JSON Web Token Claims Registration">
	<t>
	  This specification registers the following Claim in the IANA
	  "JSON Web Token Claims" registry <xref target="IANA.JWT.Claims"/>
	  established by <xref target="JWT"/>.
	</t>

	<section anchor='ClaimsContents' title='Registry Contents'>
	  <t> <?rfc subcompact="yes"?>
	  <list style='symbols'>
	    <t>
	      Claim Name: <spanx style="verb">sid</spanx>
	    </t>
	    <t>
	      Claim Description: Session ID
	    </t>
	    <t>
	      Change Controller: OpenID Foundation Artifact Binding Working Group - openid-specs-ab@lists.openid.net
	    </t>
	    <t>
	      Specification Document(s): OPLogout of this specification
	    </t>
	  </list>
	  </t>
	</section>
	<?rfc subcompact="no"?>
      </section>

      <section anchor="DynRegRegistration" title="OAuth Dynamic Client Registration Metadata Registration">
	<t>
	  This specification registers the following client metadata definitions
	  in the IANA "OAuth Dynamic Client Registration Metadata" registry
	  <xref target="IANA.OAuth.Parameters"/>
	  established by <xref target="RFC7591"/>:
	</t>

	<section anchor="DynRegContents" title="Registry Contents">
	  <t> <?rfc subcompact="yes"?>
	    <list style="symbols">
	      <t>
		Client Metadata Name: <spanx style="verb">frontchannel_logout_uri</spanx>
	      </t>
	      <t>
		Client Metadata Description:
		RP URL that will cause the RP to log itself out
		when rendered in an iframe by the OP
	      </t>
	      <t>
		Change Controller: OpenID Foundation Artifact Binding Working Group - openid-specs-ab@lists.openid.net
	      </t>
	      <t>
		Specification Document(s): RPLogout of this specification
	      </t>
	    </list>
	  </t>
	  <t>
	    <list style="symbols">
	      <t>
		Client Metadata Name: <spanx style="verb">frontchannel_logout_session_required</spanx>
	      </t>
	      <t>
		Client Metadata Description:
		Boolean value specifying whether the RP requires that
		a <spanx style="verb">sid</spanx> (session ID)
		query parameter be included to identify the RP session with the OP
		when the <spanx style="verb">frontchannel_logout_uri</spanx> is used
	      </t>
	      <t>
		Change Controller: OpenID Foundation Artifact Binding Working Group - openid-specs-ab@lists.openid.net
	      </t>
	      <t>
		Specification Document(s): RPLogout of this specification
	      </t>
	    </list>
	  </t>
	</section>
	<?rfc subcompact="no"?>
      </section>

    </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>
        </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>
        </list>
      </t>
    </section>
  </back>
</rfc>
