Accueil > OpenID Connect OAuth Server par DnC > Développer > OAuth 2.0 > Exemple de code pour le Point d’extrémité de redirection

Exemple de code pour le Point d’extrémité de redirection

L’écriture du code pour traiter le retour de l’autorisation est la partie la plus importante de l’adaptation d’une application cliente en vue d’accéder à une ressource protégée par OAuth. Cependant, il est possible d’écrire ce code pour qu’il s’adapte à tous cas de figure et qu’il puisse s’intégrer à tout développement ultérieur. L’investissement en vaut la peine !

Nous fournissons ici le squelette d’un tel code, en PHP, pour le flux Autorisation via un code (Authorization Code Grant).

Tous les cas non conformes ne sont pas traités, mais cependant le code est fonctionnel.
PHP

  1. <?php
  2.  
  3. /*
  4. Autorisation avec OAuth Server by DnC
  5.  
  6. Retour de OAuth authorize.
  7.  
  8. Ce fichier doit être installé du côté de l'application cliente.
  9. Il correspond au Point d’extrémité de redirection, ou URI de
  10. retour à l’application cliente (Redirection Endpoint).
  11.  
  12. Auteur : Bertrand degoy
  13. Copyright (c) 2016 DnC
  14. */
  15.  
  16.  
  17. //*
  18. $session_name = session_name();
  19. if ( empty($session_name) ) {
  20.     session_name('PHPSESSID');
  21. }
  22. if ( isset($_GET['state']) ) session_id($_GET['state']);
  23. //*/
  24.  
  25. // Code d'autorisation (Authorization code) retourné par le serveur
  26. $authcode = $_GET['code'];
  27. $sanitized_authcode = preg_replace('/[^a-f0-9"\']/', '', $authcode);  
  28.  
  29. if ( $sanitized_authcode === $authcode ) {  
  30.  
  31.     // Demander un jeton d'accès pour l'application
  32.     $jeton = '';
  33.  
  34.     $url = 'http://oa.dnc.global/oauth/token.php';
  35.  
  36.     $datas =  array(
  37.         'grant_type' => 'authorization_code',
  38.         'code' => $sanitized_authcode,
  39.         'client_id' => 'XXXXXXX',                        
  40.         'client_secret' => 'XXXXXXXXXXXXXX',  
  41.     );        
  42.  
  43.     $ch = curl_init();
  44.  
  45.     curl_setopt($ch, CURLOPT_URL, $url);
  46.     curl_setopt($ch, CURLOPT_POST, true);
  47.     curl_setopt($ch, CURLOPT_POSTFIELDS, $datas);
  48.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  49.     curl_setopt($ch, CURLOPT_HEADER, false);
  50.     curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  51.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  52.  
  53.     $result_json = curl_exec($ch);
  54.     $result = json_decode($result_json, true);
  55.  
  56.     $http_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
  57.  
  58.     curl_close($ch);
  59.  
  60.     switch( (int)$http_code ) {
  61.         case 200 :
  62.  
  63.             if ( $result['access_token'] ) {
  64.                 $token = $result['access_token'];
  65.                 $sanitized_token = preg_replace('/[^a-f0-9"\']/', '', $token);
  66.                 if ( $sanitized_token === $token ) {
  67.                     $jeton = $token;      
  68.                 } else {
  69.                     // Jeton d'accès corrompu
  70.                 }      
  71.             } else {
  72.                 // Application non autorisée
  73.             }
  74.             if ( $result['refresh_token'] ) {
  75.                 $refresh_token = $result['refresh_token'];
  76.                 $sanitized_rtoken = preg_replace('/[^a-f0-9"\']/', '', $refresh_token);
  77.                 if ( $sanitized_rtoken === $refresh_token ) {
  78.                     $rejeton = $refresh_token;      
  79.                 } else {
  80.                     // Jeton de rafraîchissement corrompu
  81.                 }      
  82.             } else {
  83.                 // Application non autorisée
  84.             }
  85.  
  86.             if ( !empty($jeton) AND !empty($rejeton) ) {
  87.  
  88.                 // Ici, il serait bon de vérifier le jeton, par introspection par exemple.                
  89.                 ...
  90.                 // Succès, mémoriser les jetons dans la session de l'application
  91.                 $_SESSION['oauth_access_token'] = $jeton;
  92.                 $_SESSION['oauth_refresh_token'] = $rejeton;
  93.  
  94.                 if ( $oauth_again = $_SESSION['oauth_again'] ) {
  95.                     // Reprendre où nous en étions avant l'interruption
  96.                     header('Location: ' . $oauth_again );
  97.                     exit;
  98.                 }
  99.             }
  100.             break;
  101.  
  102.         case 401 :
  103.             // Accès non autorisé : problème avec CORS ?
  104.             break;
  105.         case 405 :
  106.             // Requête invalide
  107.             break;
  108.         case 400 :
  109.             // URL non trouvée ou Accès non autorisé
  110.         default:
  111.             break;
  112.     }
  113.  
  114.     if ( empty($jeton) ) {
  115.         // Lire l'erreur
  116.         if ( !is_null( $result ) ) {
  117.             $msg = json_decode( $res, true );
  118.             echo $msg['error'];         //DEBUG
  119.         }
  120.     }
  121.  
  122. } else {
  123.     // Code d'autorisation corrompu
  124. }
  125. ?>

Télécharger

Ceci n’est qu’un exemple très incomplet. Il est important de noter que le jeton ne sert à rien, puisque nous ne le validons pas. La seule chose que nous apprend cette procédure est que l’application est autorisée, à condition toutefois que la réponse ne soit pas falsifiée. La sécurité repose sur l’intégrité de la liaison application-serveur.