/** * Interface avec OAuthSD, Flux d'autorisation de serveur à serveur * (Client Credentials Grant). * Cette fonction interroge une API protégée et retourne le résultat au format JSON. * Si l'API refuse l'accès, une nouvelle demande de jeton est lancée automatiquement. * * @param mixed $request : URI de l'appel à l'API REST * @return mixed string, bool : Résultat de la requête au format JSON ou false en * cas de refus d'accès. * * Auteur: B.Degoy DnC https://degoy.com/#dnc_conteneur_contact * licence GNU/GPL v3 * */ function ProtectedApi_GET_auto( $request ) { $session_name = session_name(); if ( empty($session_name) ) { session_name('PHPSESSID'); } session_start(); include_spip('inc/headers'); include_spip('inc/distant'); if ( isset($_GET['token']) ) $token = $_GET['token']; if ( !$token ) $token = $_SESSION['oauth_access_token']; if ( !empty($token) ) { // Interroger la ressource protégée $request_response = recuperer_url($request . "&token=$token"); if ( (int)$request_response['status'] == 200 ) { // Ok return $request_response['page']; } elseif ( (int)$request_response['status'] == 401 OR (int)$request_response['status'] == 403 ) { // Pas le droit d'accéder à cette ressource. // Commencer par vérifier le jeton $url = "http://oa.dnc.global/oauth/resource.php?access_token=" . $token; $resource_response = recuperer_url($url); $status = (int)$resource_response['status']; $page = json_decode($resource_response['page'], true); $error = $page['error']; $error_description = $page['error_description']; switch( $status ) { case 200 : // Si le jeton était valide, ne pas boucler! return false; break; default : // Demander un nouveau jeton et recommencer unset($_SESSION['oauth_access_token']); return _replay( $request ); break; } return false; } } else { // Demander un nouveau jeton et recommencer return _replay( $request ); } } function _replay( $request ) { if ( $token = GetToken() ) { $_SESSION['oauth_access_token'] = $token; $_GET['token'] = $token; ProtectedApi_GET_auto( $request ); } else return false; } /** * Demander un nouveau jeton d'accès au serveur OAuth * Flux Client Credentials Grant * * Auteur: B.Degoy DnC https://degoy.com/#dnc_conteneur_contact * licence GNU/GPL v3 * */ function GetToken() { // Interroger Token $jeton = ''; $url = 'http://oa.dnc.global/oauth/token.php'; $options = array( 'method' => 'POST', 'datas' => array( 'grant_type' => 'client_credentials', 'client_id' => 'radar', 'client_secret' => '01fc4587ab1c23ff456e448dab18327a', ) ); $res = recuperer_url( $url, $options ); $page = json_decode($res['page'], true); $token = $page['access_token']; return ( (!empty($token))? $token : false ); }