Accueil > OpenID Connect OAuth Serveur dédié > Développer > OAuth 2.0 > Une fonction pour tout simplifier !

Une fonction pour tout simplifier !

Du côté d’une application cliente, utiliser l’authentification OAuth pour interroger une API HTTP REST peut se réduire à une simple fonction.

Nous sommes dans le cas du flux Autorisation via un code (Authorization Code Grant).

Le diagramme ci-contre donne une idée simplifiée de la suite des échanges entre les 3 pôles d’un flux de type Autorisation via un code. La fonction ci-dessous correspond à la ligne "Client App". Le rafraîchissement du jeton d’accès qui apparaît dans le code a été omis dans le diagramme pour simplifier. Cliquez sur l’image pour l’agrandir


Voici un exemple en PHP pour SPIP 3.1 :
SPIP

  1. <?php
  2. /**
  3. * Interface avec OAuthSD, Autorisation via un code (Authorization Code Grant).
  4. * Cette fonction interroge une API protégée et retourne le résultat au format JSON.
  5. * Si l'API refuse l'accès, une demande d'authentification de l'utilisateur final est lancée automatiquement.  
  6. *
  7. * @param mixed $request : URI de l'appel à l'API REST
  8. * @return mixed string, bool : Résultat de la requête au format JSON ou false en cas de refus d'accès.
  9. */
  10. function ProtectedApi_GET_auto ( $request ) {
  11.  
  12.     include_spip('inc/headers');
  13.     include_spip('inc/distant');
  14.  
  15.     $token = $_SESSION['oauth_access_token'];
  16.     if ( !$token  ) {
  17.         if ( isset($_GET['token']) ) {
  18.             $token = $_GET['token'];
  19.         }
  20.     }
  21.  
  22.     if ( !empty($token) ) {
  23.  
  24.         // Interroger la ressource protégée
  25.  
  26.         $request_response = recuperer_url($request . "&token=$token");
  27.  
  28.         if ( (int)$request_response['status'] == 200 ) {
  29.             // Ok
  30.             return $request_response['page'];
  31.  
  32.         } elseif ( (int)$request_response['status'] == 401 ) {
  33.  
  34.             // Pas le droit d'accéder à cette ressource.
  35.             // Commencer par vérifier le jeton
  36.             $url = "http://oa.dnc.global/oauth/resource.php?access_token=" . $token;
  37.             $resource_response = recuperer_url($url);
  38.  
  39.             $status = (int)$resource_response['status'];
  40.             $page = json_decode($resource_response['page'], true);
  41.             $error = $page['error'];
  42.             $error_description = $page['error_description'];  
  43.  
  44.             switch( $status ) {
  45.  
  46.                 case 200 :
  47.                     // Le jeton était valide,ne pas boucler!
  48.                     return false;
  49.                     break;
  50.  
  51.                 case 401 :
  52.  
  53.                     if ( $error == 'expired_token' ) {
  54.                         // Rafraîchir le jeton expiré
  55.  
  56.                         // Interroger Token
  57.                         $options = array(
  58.                             'methode' => 'POST',
  59.                             'datas' => array(
  60.                                 'grant_type' => 'refresh_token',
  61.                                 'refresh_token' => $_SESSION['oauth_refresh_token'],
  62.                                 'client_id' => 'chemindeleau',
  63.                                 'client_secret' => '01fc4587ab1c23ff456e448dab18327a',
  64.                             ),      
  65.                         );
  66.  
  67.                         $url = "http://oa.dnc.global/oauth/token.php";
  68.                         $refresh_response = recuperer_url($url,$options);
  69.                         $refresh_status = (int)$refresh_response['status'];
  70.  
  71.                         if ( $refresh_status == 200 ) {
  72.  
  73.                             // Enregistrer le jeton d'accès et recommencer
  74.                             $page = json_decode($refresh_response['page'], true);
  75.                             $_SESSION['oauth_access_token'] = $page['access_token'];
  76.                             return ProtectedApi_GET_auto ( $request); // réentrer
  77.  
  78.                         } else
  79.                             // Demander une nouvelle authentification
  80.                             Authenticate();
  81.  
  82.                     } else return false;
  83.  
  84.                     break;
  85.  
  86.                 default :
  87.  
  88.                     // Demander une nouvelle authentification
  89.                     Authenticate();
  90.  
  91.             }
  92.             return false;
  93.         }
  94.     } else {
  95.  
  96.         // Demander une nouvelle authentification
  97.         Authenticate();
  98.  
  99.     }
  100.  
  101. }
  102.  
  103. /**
  104. * Demander une nouvelle authentification au serveur OAuth
  105. */
  106. function Authenticate() {
  107.    
  108.     // Sécurité : Générer un ID de session nouveau à chaque demande d'autorisation
  109.    
  110.     // Dire à Callback où il faudra reprendre après authentification
  111.     $_SESSION['oauth_again'] = $_SERVER['REQUEST_URI'];
  112.  
  113.     // Interroger Authorize
  114.     $url = "https://oa.dnc.global/oauth/authorize.php?response_type=code&client_id=" . APPNAME . "&state=" . session_id();
  115.     redirige_par_entete($url);    
  116.  
  117. }

Télécharger

 

L’utilisation de la fonction est très simple.
La fonction retourne un objet JSON représentant la réponse, que l’on peut facilement transformer en Array PHP :

  1. // Le nom de l'application cliente
  2. define ( 'APPNAME', 'testrpc3' );
  3. // Requete
  4. $request = "https://r.dnc.global/http.api/collectionjson/gis/27";
  5. // Afficher l'array obtenu
  6. echo print_r( json_decode( ProtectedApi_GET_auto ( $request ) ) , true );

Télécharger

Lancer un test

Dans ce test, les rôles sont les suivants :
- application cliente : chemindeleau,
- serveur de données protégées : API Rest de Radar,
- serveur d’authentification : oa.dnc.global,
- utilisateur final : vous.

Lancer le test

Vous devrez cliquer sur "Inscrivez-vous ici" pour être inscrit comme client final sur le serveur d’autorisation. Rappel : nous ne divulguons pas les E-mails.

Si vous ne voulez pas vous inscrire sur ce serveur en tant qu’utilisateur, vous pourrez utiliser les identifiants suivants :
E-mail or pseudo : bebert
Password : 012345678