<?xml version="1.0" encoding="US-ASCII"?>

<!DOCTYPE rfc SYSTEM 'rfc2629.dtd'>
<?xml-stylesheet type='text/xsl' 'rfc2629.xslt ?>

<rfc category="std" docName="draft-oauth-versatile-jwt-profile-02" ipr="trust200902" consensus="no">

<?rfc rfcedstyle="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="yes" ?>
<?rfc strict="yes" ?>
<?rfc iprnotified="no" ?>
<?rfc private="Draft" ?>




  <!-- ***** FRONT MATTER ***** -->

  <front>
    <title abbrev="OAuth Versatile JWT Assertion Profile">Versatile, Synchronous and Asynchronous, JSON Web Token (JWT) Assertion Profile for OAuth 2.0 Authorization Grants</title>

    <author fullname='Nicolas Aillery' initials='N.' surname='Aillery'>
	<organization abbrev='Orange'>Orange</organization>
	<address>
	<email>nicolas.aillery@orange.com</email>
	</address>
	</author>
	
	<author fullname='Charles Marais' initials='C.' surname='Marais'>
	<organization abbrev='Orange'>Orange</organization>
	<address>
	<email>charles.marais@orange.com</email>
	</address>
	</author>

    <date day='31' month='March' year='2017'/>

    <area>Security</area>
    <workgroup>OpenID MODRNA Working Group</workgroup>

    <keyword>OAuth</keyword>
    <keyword>JWT</keyword>
    <keyword>Assertion</keyword>
    <keyword>Token</keyword>
    <keyword>Security Token</keyword>


    <abstract>
	
      <t>This specification defines the use of a JSON Web Token (JWT) Bearer Token as a mean for 
        requesting an OAuth 2.0 access token in a versatile way, synchronous and asynchronous. This specification is a profile of <xref target="RFC6749"/> and an extension to <xref target="RFC7523"/>.
      </t>

    </abstract>

  </front>

  <middle>
    <section title="Introduction" anchor="Introduction">
 	  
      <section title="Notational Conventions" anchor="NotationalConventions">
        <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 RFC 2119 <xref target="RFC2119"/>.
        </t>
        <t>
          Unless otherwise noted, all the protocol parameter names and values are case sensitive.
        </t>
      </section>

      <section title='Terminology' anchor='Terminology'>
        <t>
	  All terms are as defined in the following specifications:
	  "The OAuth 2.0 Authorization Framework" <xref target="RFC6749"/>,
	  the OAuth Assertion Framework
	  <xref target="RFC7521"/>, <xref target="RFC7523"/>, and "JSON Web Token (JWT)" <xref target="JWT"/>.
        </t>
      </section>

	  
		<section title="Overview" anchor="overview">
	
	<t>
	The versatile JWT profile enables a Client to get an Access Token on the token endpoint.
	The versatile JWT profile is a profile to <xref target="RFC6749"/> that extends the synchronous JWT profile, defined in <xref target="RFC7523"/>.
    The versatile JWT profile enables the OP to respond either in a synchronous or asyncronous way, depending on the grant approval process.
	</t>
		
	<t>The versatile JWT profile, in abstract, follows the following steps.</t>
	<t>
	<list style="numbers">
	<t>The Client sends a Access Token Request to the OpenID Provider (OP).</t>
	<t>The OP approves the grant (potentially involving the Resource Owner in an out of band mode).</t>
	<t>The OP responds to the Client with an Access Token.</t>
	</list>
</t>

<figure>
<preamble>
These steps are illustrated in the following diagram:
</preamble>
<artwork>
+--------+                                            +--------+
|        |----(1) Access Token Request---------------&gt;|        |
|        |                                            |        |
|        |       +------------------------------------|        |
| Client |       | (2) Obtaining the grant's approval |   OP   |
|        |       +-----------------------------------&gt;|        |
|        |                                            |        |
|        |&lt;----(3) Access Token ----------------------|        |
+--------+                                            +--------+
</artwork>
</figure>

	<t>
	In order to obtain the grant's approval, the OP may reuse a previously approved grant. It may also have some interactions with other parties.
	This specification does not define the way a grant is approved.
	</t>

	<t>
	In order to retrieve the Access Token, three flows are possible:
	<list style='hanging' hangIndent='6'>
	<t hangText='Synchronous flow:'>
	The Client gets the Access Token in the initial response.
	Refer to <xref target='synchronous_flow'/> for more details.
	</t>
	<t hangText='Asynchronous Poll flow:'>
	The Client regularly calls the <spanx style="verb">Token Endpoint</spanx>.
	Refer to <xref target='asynchronous_poll_flow'/> for more details.
	</t>
	<t hangText='Asynchronous Push flow:'>
	The Client is notified on the <spanx style="verb">Client Notification Endpoint</spanx>.
	Refer to <xref target='asynchronous_push_flow'/> for more details.
	</t>
	</list>
	</t>



	<section anchor='synchronous_flow' title='Synchronous flow'>

	<t>
	In this flow, the Client gets the Access Token in the initial response.
	</t>
		
<figure>
<artwork>
+--------+                                            +--------+
|        |----(1) Access Token Request---------------&gt;|        |
|        |                                            |        |
|        |       +------------------------------------|        |
| Client |       | (2) Obtaining the grant's approval |   OP   |
|        |       +-----------------------------------&gt;|        |
|        |                                            |        |
|        |&lt;----(3) Successful Response----------------|        |
+--------+                                            +--------+
</artwork>
</figure>
			
			</section><!--Synchronous flow-->
			

	<section anchor='asynchronous_poll_flow' title='Asynchronous Poll flow'>
	<t>
	In this flow, the Client regularly calls the <spanx style="verb">Token Endpoint</spanx>.
	</t>
		
<figure>
<artwork>

+--------+                                            +--------+
|        |----(1a) Access Token Request--------------&gt;|        |
|        |                                            |        |
|        |&lt;----(1b) Pending Response------------------|        |
|        |                                            |        |
|        |       +------------------------------------|        |
| Client |       | (2) Obtaining the grant's approval |   OP   |
|        |       +-----------------------------------&gt;|        |
|        |                                            |        |
|        |----(3a) Polling Request-------------------&gt;|        |
|        |                                            |        |
|        |&lt;----(3b) Successful Polling Response-------|        |
+--------+                                            +--------+
</artwork>
</figure>
			
	</section><!--Asynchronous Poll flow-->

	
	<section anchor="asynchronous_push_flow" title='Asynchronous Push flow'>
	<t>
	In this flow, the Client is notified on the <spanx style="verb">Client Notification Endpoint</spanx>.
	</t> 

<figure>
<artwork>
+--------+                                            +--------+
|        |----(1a) Access Token Request--------------&gt;|        |
|        |                                            |        |
|        |&lt;----(1b) Pending Response------------------|        |
|        |                                            |        |
|        |       +------------------------------------|        |
| Client |       | (2) Obtaining the grant's approval |   OP   |
|        |       +-----------------------------------&gt;|        |
|        |                                            |        |
|        |&lt;----(3a) Notification of Success-----------|        |
|        |                                            |        |
|        |----(3b) Acknowledgement-------------------&gt;|        |
+--------+                                            +--------+
</artwork>
</figure>

			</section><!--Asynchronous Push flow-->
		
	  
	  
    </section><!--Overview-->
</section><!--Introduction-->
	
<section anchor="client_registration" title='Client registration'>

	<t>
	If the Client wants to use the Asynchrounous Push mode (<xref target='asynchronous_push_mode'/>), it MUST register its <spanx style="verb">client_notification_endpoint</spanx>. 
	The <spanx style="verb">client_notification_endpoint</spanx> is a callback URL on the Client. 
	If the client does not use the Asynchrounous Push mode, it can obtain the result by using the Asynchrounous Poll mode (<xref target='asynchronous_poll_mode'/>). 
	Both mechanisms are not mutual exclusive, i.e. a given <spanx style="verb">client_id</spanx> can use both mechanisms, but not in the same transaction. 
	</t>

</section><!--Client registration-->
		
	
<section anchor="initial_access_token_request" title="Initial Access Token Request">


<section anchor="access_token_request" title="Access Token Request">

<t>
The initial Access Token Request to the token endpoint is defined in Section 2.1 of <xref target="RFC7523"/>. 
This specification proposes a specific <spanx style='verb'>grant_type</spanx> and an additional parameter <spanx style='verb'>client_notification_token</spanx>:
</t>

<t>
	<list style="hanging">
	<!---->
	<t hangText="grant_type"><vspace />
	MANDATORY. 
	In order to enable an asynchronous mode, the <spanx style='verb'>grant_type</spanx> value MUST be set to: <spanx style="verb">urn:ietf:params:oauth:grant-type:jwt-bearer:versatile:poll_mode</spanx> or <spanx style="verb">urn:ietf:params:oauth:grant-type:jwt-bearer:versatile:push_mode</spanx>.
	Using the grant_type <spanx style="verb">urn:ietf:params:oauth:grant-type:jwt-bearer:versatile:poll_mode</spanx> means that, in case of asynchronous response, the Client will use the Asynchronous Poll mode, defined in <xref target='asynchronous_poll_mode'/>.
	Using the grant_type <spanx style="verb">urn:ietf:params:oauth:grant-type:jwt-bearer:versatile:push_mode</spanx> means that, in case of asynchronous response, the Client will use the Asynchronous Push mode, defined in <xref target='asynchronous_push_mode'/>.
	</t>
	<!---->
	<t hangText="client_notification_token"><vspace />
	MANDATORY if the Client uses the Asynchronous Push mode described in <xref target='asynchronous_push_mode'/>. MUST NOT be used otherwise.
	The <spanx style="verb">client_notification_token</spanx> is an opaque token issued by the Client. The Client SHOULD NOT reuse a <spanx style="verb">client_notification_token</spanx>. The Client SHOULD use a random value with a level of entropy high enough to cover its security requirements.
	The <spanx style="verb">client_notification_token</spanx> is a Bearer Token used by the Client to authorize the OP when the OP sends the Token Response to the Client Notification Endpoint.
	The <spanx style="verb">client_notification_token</spanx> value is a case sensitive string.
	</t>
	<!---->
	</list>
</t>

<t>
Authentication of the Client is optional, as described in Section 3.2.1 of OAuth 2.0 <xref target="RFC6749"/>.
If the Client authenticated for the Initial Access Token Request defined in <xref target='access_token_request'/>, it MUST authenticate for the Polling Request.
</t>

<figure>
<preamble>
The following is a non-normative example of an initial Access Token Request. 
</preamble>
<artwork>
POST /token.oauth2 HTTP/1.1
Host: example.as.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type
   %3Ajwt-bearer%3Aversatile%3Apush_mode
&amp;assertion=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
   ZhwP[...omitted for brevity...].
   paC4[...omitted for brevity...]
&amp;scope=scope_a%20scope_b
&amp;client_notification_token=vO4n2DAeRrcWE0VAlo4I
</artwork>
</figure>

</section><!--Access Token Request-->

<section anchor="access_token_responses" title="Access Token Responses">

<t>
   If the grant is approved, the token endpoint responds with a success response defined in <xref target='successful_response'/>; 
   if the grant has not been approved yet, the token endpoint responds with a pending response defined in <xref target='pending_response'/>; 
   otherwise it responds with an error, as defined in <xref target='error_response'/>.
</t>

<section anchor="successful_response" title="Successful Response">

<t>
   If the grant has been approved, the token endpoint responds with a success response defined in Section 5.1 of <xref target='RFC6749'/>.
</t>

<figure>
<preamble>
The following is a non-normative example of a Successful Response. 
</preamble>
<artwork>
HTTP/1.1 200 OK 
Content-Type: application/json 
Cache-Control: no-store 
Pragma: no-cache

{
    "access_token": "SlAV32hkKG",
    "token_type": "Bearer",
    "refresh_token": "8xLOxBtZp8",
    "expires_in": 3600
} 
</artwork>
</figure>
</section><!--Successful Response-->

<section anchor="pending_response" title="Pending Response">

<t>
   If the grant has not been aproved yet, the token endpoint responds with a HTTP 202 Accepted response.
   The response body contains JSON structure, with the following attributes.
</t>
<t>
	<list style="hanging">
	<!---->
	<t hangText="transaction_id"><vspace />
	MANDATORY.
	The <spanx style="verb">transaction_id</spanx> attribute contains the <spanx style="verb">transaction_id</spanx> value.
	The <spanx style="verb">transaction_id</spanx> value is used to identify the transaction in the asynchronous modes defined in <xref target='asynchronous_poll_mode'/> and <xref target='asynchronous_push_mode'/>.
	The <spanx style="verb">transaction_id</spanx> SHOULD be a random value with a level of entropy high enough to prevent guessing and replay by a Client.
	The <spanx style="verb">transaction_id</spanx> value is a case sensitive string.
	</t>
	<!---->
	<t hangText="expires_in"><vspace />
	OPTIONAL.
	The <spanx style="verb">expires_in</spanx> attribute contains the <spanx style="verb">expires_in</spanx> value.
	The <spanx style="verb">expires_in</spanx> value is  lifetime in seconds of the <spanx style="verb">transaction_id</spanx>.
	The <spanx style="verb">expires_in</spanx> value is an integer.
	</t>
	<!---->
	<t hangText="interval"><vspace />
	OPTIONAL.
	The <spanx style="verb">interval</spanx> attribute contains the <spanx style="verb">interval</spanx> value. 
	The <spanx style="verb">interval</spanx> value is the minimum amount of time in seconds that the client SHOULD wait between polling requests to the token endpoint. 
	The <spanx style="verb">interval</spanx> value is an integer.
	</t>
	<!---->
	</list>
</t>


<figure>
<preamble>
The following is a non-normative example of a Pending Response. 
</preamble>
<artwork>
HTTP/1.1 202 Accepted
Content-Type: application/json

{
    "transaction_id": "b0f9f8022e344f9984dcc7d3d4d4",
    "expires_in": 1800,
    "interval": 5
}
</artwork>
</figure>
</section><!--Pending Response-->



<section anchor="error_response" title="Error Response">

<t>
   If the Access Token Request can not be processed, the token endpoint responds with an error, as defined in Section 5.2 of <xref target='RFC6749'/>, 
   with the following additional error code, specific for the versatile JWT profile:
</t>
   
 <t>
	<list style="hanging">
	<!---->
	<t hangText="forbidden_mode"><vspace />
	The Client set the <spanx style="verb">grant_type</spanx> to <spanx style="verb">urn:ietf:params:oauth:grant-type:jwt-bearer:versatile:push_mode</spanx> in the Access Token Request, but did not register a <spanx style="verb">client_notification_endpoint</spanx>.
	</t>
	<!---->
	</list>
</t>
   



<figure>
<preamble>
The following is a non-normative example of an Error Response. 
</preamble>
<artwork>
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store 

{
   "error":"invalid_grant",
   "error_description":"Audience validation failed"
}
</artwork>
</figure>
</section><!--Error Response-->
</section><!--Access Token Responses-->
</section><!--Initial Access Token Request-->
	
	
<section anchor="asynchronous_poll_mode" title="Asynchronous Poll mode">

<t>
In order to detect that a pending grant has been approved, the Client can poll the token endpoint.
If the grant has been approved, the token endpoint reponds  in the response.
Else, the token endpoint responds with HTTP 400 Bad Request.
</t>
<t>			
A Client configured with a <spanx style="verb">client_notification_endpoint</spanx> MUST NOT send a Polling Request.
</t>

<section anchor="polling_request" title="Polling Request">

<t>
The Polling Request to the token endpoint is defined in Section 2.1 of <xref target="RFC7523"/>. 
This specification proposes a specific <spanx style='verb'>grant_type</spanx>, an additional parameter <spanx style='verb'>transaction_id</spanx> and the limitation to those two attributes:
</t>

<t>
	<list style="hanging">
	<!---->
	<t hangText="grant_type"><vspace />
	MANDATORY. In order to indicate a Polling Request, the <spanx style='verb'>grant_type</spanx> value MUST be set to <spanx style='verb'>urn:ietf:params:oauth:grant-type:jwt-bearer:versatile:polling</spanx>.
	</t>
	<!---->
	<t hangText="transaction_id"><vspace />
	MANDATORY.
	The <spanx style="verb">transaction_id</spanx> value contains the <spanx style="verb">transaction_id</spanx> received from the Pending Response (<xref target='pending_response'/>).
	The <spanx style="verb">transaction_id</spanx> value is a case sensitive string.	
	</t>
	<!---->
	</list>
</t>

<t>
The parameters <spanx style='verb'>grant_type</spanx> and <spanx style='verb'>transaction_id</spanx> are the only attributes that the token endpoint SHOULD consider in a Polling Request.
</t>
<t>
Authentication of the Client is optional, as described in Section 3.2.1 of OAuth 2.0 <xref target="RFC6749"/>.
</t>

<figure>
<preamble>
The following is a non-normative example of an Polling Request. 
</preamble>
<artwork>
POST /token.oauth2 HTTP/1.1
Host: example.as.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
   %3Aversatile%3Apolling
&amp;transaction_id=b0f9f8022e344f9984dcc7d3d4d4
</artwork>
</figure>
</section><!--Polling Request-->

<section anchor="polling_responses" title="Polling Responses">
<t>
   If the grant has been approved, the token endpoint responds with a Successful Polling Response, defined in <xref target='successful_polling_response'/>.
   Else, the token endpoint responds with an Error Polling Response defined in <xref target='error_polling_response'/>.
</t>

<section anchor="successful_polling_response" title="Successful Polling Response">

<t>
   If the grant has been approved, the token endpoint responds with a success response defined in Section 5.1 of <xref target='RFC6749'/>.
</t>

<figure>
<preamble>
The following is a non-normative example of a Successful Polling Response. 
</preamble>
<artwork>
HTTP/1.1 200 OK 
Content-Type: application/json 
Cache-Control: no-store 
Pragma: no-cache

{
    "access_token": "SlAV32hkKG",
    "token_type": "Bearer",
    "refresh_token": "8xLOxBtZp8",
    "expires_in": 3600
} 
</artwork>
</figure>
</section><!--Successful Polling Response-->

<section anchor="error_polling_response" title="Error Polling Response">

<t>
   If the grant has not been approved yet or if the Polling Request can not be processed, the token endpoint responds with an error, as defined in Section 5.2 of <xref target='RFC6749'/>, 
   with the following additional error codes, specific for the versatile JWT profile:
</t>
   
 <t>
	<list style="hanging">
	<!---->
	<t hangText="authorization_pending"><vspace />
	The Access Token Request is still pending as the authorization has not been gained yet. 
	The client should repeat the Access Token Request to the token endpoint.
	</t>
	<!---->
	<t hangText="slow_down"><vspace />
	The client is polling too quickly and should back off at a reasonable rate.
	</t>
	<!---->
	<t hangText="expired_transaction"><vspace />
	The <spanx style="verb">transaction_id</spanx> has expired. The client will need to make a new  Access Token Request (<xref target='access_token_request'/>).
	</t>
	<!---->
	<t hangText="invalid_transaction_id"><vspace />
    The Client sent a polling request for a <spanx style="verb">transaction_id</spanx> that does not exist or is not valid for the requesting Client.	
	</t>
	<!---->
	<t hangText="forbidden_polling"><vspace />
	The Client sent a Polling Request whereas it set the <spanx style="verb">grant_type</spanx> to <spanx style="verb">urn:ietf:params:oauth:grant-type:jwt-bearer:versatile:push</spanx> in the Access Token Request.
	</t>
	<!---->
	</list>
</t>
   
<t>
   The error codes <spanx style="verb">authorization_pending</spanx> and <spanx style="verb">slow_down</spanx> are
   considered soft errors.  The client should continue to poll the token
   endpoint by repeating the Polling Request (<xref target='polling_request'/>) when
   receiving soft errors, increasing the time between polls if a
   <spanx style="verb">slow_down</spanx> error is received.  Other error codes are considered hard
   errors; the client should stop polling and react accordingly.

   The interval at which the client polls MUST NOT be more frequent than
   the <spanx style="verb">interval</spanx> parameter returned in the Pending Response (<xref target='pending_response'/>).
</t>


<figure>
<preamble>
The following is a non-normative example of an Error Polling Response. 
</preamble>
<artwork>
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store 
{
   "error":"invalid_transaction_id",
   "error_description":"The transaction_id is not valid."
}
</artwork>
</figure>
</section><!--Error Polling Response-->

</section><!--Polling Responses-->
</section><!--Asynchronous Poll mode-->

	
	
<section anchor="asynchronous_push_mode" title="Asynchronous Push mode">

<t>
If the Client registered a <spanx style="verb">client_notification_endpoint</spanx>, the OP MUST notify the Client when a pending grant has been approved or an error occured.
The Notification is sent to the Client using a HTTP POST on the Client Notification Endpoint.
</t>
<t>
Communication with the Client Notification Endpoint MUST utilize TLS. 
</t>
<t>			
A Client configured with a <spanx style="verb">client_notification_endpoint</spanx> MUST wait for a Notification on its <spanx style="verb">client_notification_endpoint</spanx>.
</t>

<section anchor="notification_of_success" title="Notification of Success">

	<t>
	The OP sends the Notification of Success to the Client using HTTP POST.
	</t>
	
	<t>
	The HTTP POST request MUST contain the following header:
	<list style="hanging">
	<!---->
	<t hangText="Authorization"><vspace />
	MANDATORY. 
	The <spanx style="verb">Authorization</spanx> value contains the <spanx style="verb">client_notification_token</spanx> specified in the Access Token Request and used as a <xref target='RFC6750'/> Bearer Token. 
	The <spanx style="verb">Authorization</spanx> value is a case sensitive string. 
	</t>
	<!---->		
	</list>
	</t>
	<t>
	A Notification of Success contains a JSON object, as defined in Section 5.1 of <xref target='RFC6749'/>, with the additional attribute <spanx style="verb">transaction_id</spanx>.
	</t>
	<t>
	A Notification is a Notification of Error if the JSON object contains an <spanx style="verb">error</spanx> attribute. Otherwise, it's a Notification of Success.
	</t>
	<t>
	<list style="hanging">
	<!---->
	<t hangText="transaction_id"><vspace />
	MANDATORY.
	The <spanx style="verb">transaction_id</spanx> links the Notification with a Pending Response (<xref target='pending_response'/>).
	</t>
	<!---->	
	</list>
	</t>


<figure>
<preamble>
The following is a non-normative example of a Notification of Success. 
</preamble>
<artwork>
POST /notification  HTTP/1.1
Host: example.client.com
Authorization: Bearer vO4n2DAeRrcWE0VAlo4I
Content-Type: application/json

{
    "transaction_id": "b0f9f8022e344f9984dcc7d3d4d4",
    "access_token": "SlAV32hkKG",
    "token_type": "Bearer",
    "refresh_token":  "8xLOxBtZp8",
    "expires_in": 3600
}
</artwork>
</figure>

</section><!--Notification of Success-->

<section anchor="notification_of_error" title="Notification of Error">

	<t>
	The OP sends the Notification of Error to the Client using HTTP POST.
	</t>

	<t>
	The HTTP POST request MUST contain the following header:
	<list style="hanging">
	<!---->
	<t hangText="Authorization"><vspace />
	MANDATORY. 
	The <spanx style="verb">Authorization</spanx> value contains the <spanx style="verb">client_notification_token</spanx> specified in the Access Token Request and used as a <xref target='RFC6750'/> Bearer Token. 
	The <spanx style="verb">Authorization</spanx> value is a case sensitive string. 
	</t>
	<!---->		
	</list>
	</t>

	<t>
	A Notification of Error contains a JSON object, as defined in Section 5.2 of <xref target='RFC6749'/>, with the additional attribute <spanx style="verb">transaction_id</spanx>.
	</t>
	<t>
	A Notification is a Notification of Error if the JSON object contains an <spanx style="verb">error</spanx> attribute. Otherwise, it's a Notification of Success.
	</t>
	<t>
	<list style="hanging">
	<!---->
	<t hangText="transaction_id">
	MANDATORY.
	The <spanx style="verb">transaction_id</spanx> links the Notification with a Pending Response (<xref target='pending_response'/>).
	</t>
	<!---->	
	</list>
	</t>

<figure>
<preamble>
The following is a non-normative example of a Notification of Error. 
</preamble>
<artwork>
POST /notification  HTTP/1.1
Host: example.client.com
Authorization: Bearer vO4n2DAeRrcWE0VAlo4I
Content-Type: application/json

{
   "transaction_id": "b0f9f8022e344f9984dcc7d3d4d4",
   "error":"invalid_grant",
   "error_description":"Audience validation failed"
}
</artwork>
</figure>
</section><!--Notification of Error-->

<section title='Processing the Authorization'>
	<t>
	The <spanx style="verb">Authorization</spanx> value is a <spanx style="verb">client_notification_token</spanx>.
	This <spanx style="verb">client_notification_token</spanx> enables to retrieve the <spanx style="verb">transaction_id</spanx> received in the Pending Response (<xref target='pending_response'/>).
	The <spanx style="verb">transaction_id</spanx> in the Notification MUST match with the <spanx style="verb">transaction_id</spanx> received in the Pending Response (<xref target='pending_response'/>).
	</t>
</section><!--Processing the Authorization-->


<section anchor="acknowledgement" title="Acknowledgement">

<t>
	The acknowledgement MUST be a HTTP 200 OK. This HTTP response SHOULD be ignored by the OP.
</t>

<figure>
<preamble>
The following is a non-normative example of an Acknowledgement. 
</preamble>
<artwork>
HTTP/1.1 200 OK 
</artwork>
</figure>
</section><!--Acknowledgement-->

</section><!--Asynchronous Push mode-->
	

    <section anchor="Interoperability" title="Interoperability Considerations">
	<t>For Interoperability Considerations, please refer to:
	<list style="symbols">
	<!---->
	<t>Section 7 of <xref target="RFC7521"/></t>
	<!---->
	<t>Section 5 of <xref target="RFC7523"/></t>
	<!---->	
	</list>
    </t>
    </section><!--Interoperability Considerations-->

    <section anchor="Security" title="Security Considerations">
	<t>For Security Considerations, please refer to:
	<list style="symbols">
	<!---->
	<t>Section 10 of <xref target="RFC6749"/></t>
	<!---->	
	<t>Section 8 of <xref target="RFC7521"/></t>
	<!---->
	<t>Section 6 of <xref target="RFC7523"/></t>
	<!---->
	<t>Section 11 of <xref target="JWT"/></t>
	<!---->		
	</list>
    </t>
    </section><!--Security Considerations-->
	
	
    <section anchor="Privacy" title="Privacy Considerations">
	<t>For Privacy Considerations, please refer to:
	<list style="symbols">
	<!---->
	<t>Section 7 of <xref target="RFC7523"/></t>
	<!---->
	<t>Section 12 of <xref target="JWT"/></t>
	<!---->		
	</list>
    </t>
	
    </section><!--Privacy Considerations-->
	
    <section title='IANA Considerations' anchor="IANA">

		<section title='OAuth Parameter Registration'>
			<t>
			This specification registers the following values in the IANA "OAuth Parameters" registry <xref target="IANA.OAuth.Parameters"/> established by <xref target="RFC6755"/>.
			</t>

			<section title='Registry Contents'>
			<t>
			<list style='symbols'>
			<t>Parameter name: client_notification_token</t>
			<t>Parameter usage location: Access Token Request</t>
			<t>Change Controller: IESG</t>
			<t>Specification Document: <xref target='access_token_request'/> of this specification</t>
			</list>
		
			<list style='symbols'>
			<t>Parameter name: transaction_id</t>
			<t>Parameter usage location: Polling Request</t>
			<t>Change Controller: IESG</t>
			<t>Specification Document: <xref target='polling_request'/> of this specification</t>
			</list>

			</t>
			</section>

		</section><!--OAuth URI Registration-->
	
		<section title='OAuth URI Registration'>
			<t>
			This specification registers the following values in the IANA "OAuth URI" registry <xref target="IANA.OAuth.Parameters"/> established by <xref target="RFC6755"/>.
			</t>
			
			<section title='Registry Contents'>
			<t>
			
			<list style='symbols'>
			<t>URN: urn:ietf:params:oauth:grant-type:jwt-bearer:versatile:push_mode</t>
			<t>Common Name: Push mode of the Versatile JWT Bearer Token Grant Type Profile for OAuth 2.0</t>
			<t>Change Controller: IESG</t>
			<t>Specification Document: <xref target='access_token_request'/> of this specification</t>
			</list>

			<list style='symbols'>
			<t>URN: urn:ietf:params:oauth:grant-type:jwt-bearer:versatile:poll_mode</t>
			<t>Common Name: Poll mode of the Versatile JWT Bearer Token Grant Type Profile for OAuth 2.0</t>
			<t>Change Controller: IESG</t>
			<t>Specification Document: <xref target='access_token_request'/> of this specification</t>
			</list>
		
			<list style='symbols'>
			<t>URN: urn:ietf:params:oauth:grant-type:jwt-bearer:versatile:polling</t>
			<t>Common Name: Polling for Versatile JWT Bearer Token Profile for OAuth 2.0</t>
			<t>Change Controller: IESG</t>
			<t>Specification Document: <xref target='polling_request'/> of this specification</t>
			</list>
			
			</t>
			</section>

		</section><!--OAuth URI Registration-->
		
		<section title='OAuth Extensions Error Registration'>
			<t>
			This specification registers the following values in the IANA "OAuth Extensions Error Registry" registry <xref target="IANA.OAuth.Parameters"/> established by <xref target="RFC6755"/>.
			</t>
			
			<section title='Registry Contents'>
			<t>
				
			<list style='symbols'>
			<t>Error name: authorization_pending</t>
			<t>Error usage location: Error Polling Response</t>
			<t>Related protocol extension: draft-ietf-oauth-device-flow-05</t>
			<t>Change controller: IETF</t>
			<t>Specification Document: Section 3.5 of draft-ietf-oauth-device-flow-05</t>
			</list>
			
			<list style='symbols'>
			<t>Error name: slow_down</t>
			<t>Error usage location: Error Polling Response</t>
			<t>Related protocol extension: draft-ietf-oauth-device-flow-05</t>
			<t>Change controller: IETF</t>
			<t>Specification Document: Section 3.5 of draft-ietf-oauth-device-flow-05</t>
			</list>

			<list style='symbols'>
			<t>Error name: expired_token</t>
			<t>Error usage location: Error Polling Response</t>
			<t>Related protocol extension: draft-ietf-oauth-device-flow-05</t>
			<t>Change controller: IETF</t>
			<t>Specification Document: Section 3.5 of draft-ietf-oauth-device-flow-05</t>
			</list>

			<list style='symbols'>
			<t>Error name: invalid_transaction_id</t>
			<t>Error usage location: Error Polling Response</t>
			<t>Related protocol extension: this specification</t>
			<t>Change controller: IETF</t>
			<t>Specification Document: <xref target='error_polling_response'/> of this specification</t>
			</list>				
						
			<list style='symbols'>
			<t>Error name: forbidden_polling</t>
			<t>Error usage location: Error Polling Response</t>
			<t>Related protocol extension: this specification</t>
			<t>Change controller: IETF</t>
			<t>Specification Document: <xref target='error_polling_response'/> of this specification</t>
			</list>	
		
			<list style='symbols'>
			<t>Error name: forbidden_mode</t>
			<t>Error usage location: Error Response</t>
			<t>Related protocol extension: this specification</t>
			<t>Change controller: IETF</t>
			<t>Specification Document: <xref target='error_response'/> of this specification</t>
			</list>
				
			</t>
			</section>
			
		</section><!--OAuth Extensions Error Registration-->
		
    </section><!--IANA Considerations-->
  </middle>

  <!-- *****BACK MATTER ***** -->

  <back>


    <references title="Normative References">

		<?rfc include='reference.RFC.2119.xml' ?>
		<?rfc include='reference.RFC.6749.xml' ?>
		<?rfc include='reference.RFC.6750.xml' ?>
		<?rfc include='reference.RFC.7523.xml' ?>


      <reference anchor="RFC7521" target='http://www.rfc-editor.org/info/rfc7521'>
	<front>
	  <title abbrev="OAuth Assertion Framework">Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants</title>
	  <author fullname="Brian Campbell" initials="B." surname="Campbell">
	    <organization abbrev="Ping Identity">Ping Identity</organization>
	  </author>
	  <author fullname="Chuck Mortimore" initials="C." surname="Mortimore">
	    <organization abbrev="Salesforce">Salesforce.com</organization>
	  </author>
	  <author fullname="Michael B. Jones" initials="M.B." surname="Jones">
	    <organization abbrev="Microsoft">Microsoft</organization>
	  </author>
	  <author fullname="Yaron Y. Goland" initials="Y.Y." surname="Goland">
	    <organization abbrev="Microsoft">Microsoft</organization>
	  </author>
	  <date month="May" year="2015" />
	</front>
	<seriesInfo name="RFC" value="7521"/>
      </reference>

      <reference anchor="JWT" target='http://www.rfc-editor.org/info/rfc7519'>
        <front>
          <title>JSON Web Token (JWT)</title>
	  <author fullname="Michael B. Jones" initials="M.B." surname="Jones">
	    <organization>Microsoft</organization>
	    <address>
	      <email>mbj@microsoft.com</email>
	      <uri>http://self-issued.info/</uri>
	    </address>
	  </author>
	  <author fullname="John Bradley" initials="J." surname="Bradley">
	    <organization abbrev="Ping Identity">Ping Identity</organization>
	    <address>
	      <email>ve7jtb@ve7jtb.com</email>
	    </address>
	  </author>
	  <author fullname="Nat Sakimura" initials="N." surname="Sakimura">
	    <organization abbrev="NRI">Nomura Research Institute</organization>
	    <address>
	      <email>n-sakimura@nri.co.jp</email>
	    </address>
	  </author>
	  <date month="May" year="2015"/>
        </front>
        <seriesInfo name="RFC" value="7519"/>
      </reference>

      <reference anchor="IANA.OAuth.Parameters" target='http://www.iana.org/assignments/oauth-parameters'>
        <front>
          <title>OAuth Parameters</title>
		<author fullname="" initials="" surname="">
			 <organization>IANA</organization>
		</author>
	  <date month="" year=""/>
        </front>
      </reference>
	  
    </references>

    <references title="Informative References">
      <?rfc include='reference.RFC.6755.xml' ?>

	  
    </references>

    <section title='Acknowledgements' anchor='Acknowledgements' numbered="no"></section>
  </back>
</rfc>
