Accueil > OpenID Connect OAuth Server par DnC > Développer > OAuth 2.0 : Obtenir un jeton d’accès

OAuth 2.0 : Obtenir un jeton d’accès

L’application cliente doit disposer d’un jeton d’accès pour obtenir des données protégées de la part d’un serveur de ressources.

Au préalable, l’application doit avoir obtenu un jeton d’autorisation auprès du serveur (point de terminaison authorize).

Le code nécessaire est entièrement à la charge de l’auteur de l’application cliente, en réaction à la redirection sur l’URI du point d’extrémité de redirection. La méthode dépend du flux d’autorisation : avec Authorization Code Grant, l’application cliente doit d’abord obtenir un code d’autorisation.

Point d’extrémité de jeton (Token Endpoint)

https://oa.dnc.global/oauth/token.php

Le point d’extrémité de jeton est le point d’extrémité sur le serveur d’autorisation auquel s’adresse l’application cliente avec le code d’autorisation, l’ID client et le secret, pour obtenir un jeton d’accès.

C’est également à ce point qu’une application s’adresse pour Rafraîchir (actualiser) un jeton d’accès.

Forme de la demande de jeton d’accès

La demande ne doit être effectuée que par la méthode POST.
Les paramètres suivants doivent être postés :
- grant_type : Type de flux d’autorisation, par exemple "authorization_code".
- code : le code d’autorisation reçu.
- client_id : l’ID de l’application cliente.
- client_secret : le secret de l’application cliente.

Le client inclut également ses informations d’authentification telles que décrites à la section 2.3. du document [RFC6749].

Les valeurs données pour les paramètres grant_type, client_id et client_secret doivent correspondre aux valeurs définies lors de l’inscription de l’application cliente sur le serveur.

Notes :
- Il existe une façon de demander un jeton sans transmetre les identifiants de l’application cliente : Demande d’autorisation avec JWT (JWT Bearer Authorization Grant).

Réponse du serveur

En cas de succès, le serveur retourne une réponse HTTP 200.

Le corps de la réponse contient un tableau portant les informations suivantes :

index type valeur
page JSON array access_token : jeton d’accès

Le Header comporte, comme il se doit, la directive ’Cache-Control : no-cache, no-store’.

 

En cas d’échec, le corps de la réponse contient :

index type valeur
page JSON Array error : titre de l’erreur,
error_description : description de l’erreur

La réponse HTTP ainsi que les valeurs de error et error_description sont données par le tableau suivant :

Réponse error
titre de l’erreur
error_description
description de l’erreur
Explication
405 invalid_request The request method must be POST when requesting an access token La méthode de la demande doit être POST lorsque vous demandez un jeton d’accès. Notez que le Header contient ’Allow : POST’
400 invalid_request The grant type was not specified in the request Le type d’autorisation n’a pas été spécifié dans la demande
400 unsupported_grant_type Grant type "X" not supported Le Type d’autorisation "X" n’est pas supporté.
400 invalid_grant X doesn\’t exist or is invalid for the client Le type d’autorisation indiqué n’existe pas ou est invalide pour le client
400 unauthorized_client The grant type is unauthorized for this client_id Le type d’autorisation n’est pas autorisé pour ce client_id
400 invalid_scope The scope requested is invalid for this request La portée d’autorisation demandée est invalide pour cette demande
400 invalid_scope The scope requested is invalid for this client La portée d’autorisation demandée est valide pour ce client
400 invalid_scope An unsupported scope was requested La portée d’autorisation demandée n’est pas supportée

Exemples de code

Données de la requête :
- $AuthCode est le code d’autorisation obtenu à l’étape précédente et transmis à la page de CallBack
- $client_id, $client_secret : Comme indiqué lors de l’inscription de l’application cliente sur le serveur d’autorisation.

PHP

  1. // Demander un jeton d'accès pour l'application
  2.     $jeton = '';
  3.  
  4.     $url = 'https://oa.dnc.global/oauth/token.php';
  5.  
  6.     $datas =  array(
  7.         'grant_type' => 'authorization_code',
  8.         'code' => $AuthCode ,
  9.         'client_id' => 'XXXXXX',                              
  10.         'client_secret' => 'XXXXXXXXXXX',  
  11.     );        
  12.  
  13.     $ch = curl_init();
  14.  
  15.     curl_setopt($ch, CURLOPT_URL, $url);
  16.     curl_setopt($ch, CURLOPT_POST, true);
  17.     curl_setopt($ch, CURLOPT_POSTFIELDS, $datas);
  18.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  19.     curl_setopt($ch, CURLOPT_HEADER, false);
  20.     curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  21.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  22.  
  23.     $result_json = curl_exec($ch);
  24.     $result = json_decode($result_json, true);
  25.  
  26.     $token = $result['access_token'];
  27.  
  28.     curl_close($ch);

Télécharger

SPIP

  1.         $jeton = '';
  2.         $url = 'https://oa.dnc.global/oauth/token.php';
  3.         $options = array(
  4.             'method' => 'POST',
  5.             'datas' =>  array(
  6.                 'grant_type' => 'authorization_code',
  7.                 'code' => '$AuthCode',
  8.                 'client_id' => 'XXXXXX',                              
  9.                 'client_secret' => 'XXXXXXXXXXX',  
  10.             )        
  11.         );
  12.  
  13.         $res = recuperer_url($url, $options);
  14.  
  15.         $page = json_decode($res['page'], true);
  16.  
  17.         $token = $page['access_token'];

Télécharger

Compléments à propos du type de flux JWT Bearer

Comme son nom l’indique, ce flux d’autorisation transporte un jeton JWT (JSON Web Token) au lieu d’un simple jeton opaque. Ce faisant, la validation du jeton est plus sûre et des informations sur l’application et l’utilisateur sont directement véhiculées par le jeton.

Le type de flux JWT Bearer réclame plus de paramètres dans la requête et effectue des vérifications concernant l’application cliente et l’utilisateur final.

En plus des paramètres décrits précédemment, JWT Bearer demande que le paramètre suivant lui soit posté :
- assertion : Un jeton JWT.

Par exemple, dans le cas d’un flux d’autorisation (Authorization Code Grant) :

POST /token.oauth2 HTTP/1.1
    Host: oa.dnc.global
    Content-Type: application/x-www-form-urlencoded
    grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhtpZCI6IjE2In0.eyJpc3Mi.J9l-ZhwP.

Dans le cas d’un flux d’authentification d’une application cliente (Client Authentication), le contrôleur Token met en oeuvre l’interface ClientAssertionType. Il faut alors fournir (voir RFC 7523) :
- client_assertion_type : urn:ietf:params:oauth:grant-type:jwt-bearer,
- client_assertion : Un jeton JWT.

Par exemple :

POST /token.oauth2 HTTP/1.1
    Host: as.example.com
    Content-Type: application/x-www-form-urlencoded

    grant_type=authorization_code&
    code=n0esc3NRze7LTCu7iYzS6a5acc3f0ogp4&
    client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=eyJhtpZCI6IjE2In0.eyJpc3Mi.J9l-ZhwP.

En cas d’échec, la réponse HTTP ainsi que les valeurs de error et error_description sont données par le tableau suivant :

Réponse error
titre de l’erreur
error_description
description de l’erreur
Explication
400 invalid_request The request method must be POST when revoking an access token La méthode de la demande doit être POST lorsque vous révoquez un jeton d’accès
400 invalid_request Missing parameters : "assertion" required Le parmètre assertion, passant le jeton JWT manque
400 invalid_request JWT is malformed
400 invalid_grant Invalid issuer (iss) provided
400 invalid_grant Invalid subject (sub) provided
400 invalid_grant Expiration (exp) time must be present
400 invalid_grant JWT has expired
400 invalid_grant Expiration (exp) time must be a unix time stamp
400 invalid_grant JWT cannot be used before the Not Before (nbf) time
400 invalid_grant Not Before (nbf) time must be a unix time stamp
400 invalid_grant Invalid audience (aud) Le paramètre audience ( Token Endpoint URI, URI du point de terminaison de jeton) est invalide
400 invalid_grant JSON Token Identifier (jti) has already been used
400 invalid_grant Invalid issuer (iss) or subject (sub) provided La clé publique n’a pas été trouvée pour le couple issuer (iss) - subject (sub) fourni par le jeton
400 invalid_grant JWT failed signature verification