Fonction OAuth 2.0 Authorization Basic Client Credentials


Fonction OAuth 2.0 Authorization Basic Client Credentials

Messagepar dommarion » 25 Nov 2023 09:42

Bonjour à tous,
Je vous propose une fonction pour effectuer le OAuth 2.0 authorization Basic et Client Credentials (flux 3 et 4). :ugeek:
Cette méthode repose sur un Client_id et Client_Secret et permet d'obtenir un Token a durée de vie illimitée (pas de Refresh Token) selon la spécification rfc6749.
Pour obtenir ce token (flux 4), des éléments doivent être fournis tels que client_id, client_secret, uri, oauth_url (flux 3).
Cette réquête sera insérée dans le header à la rubrique Authorization, avec d'autres éléments plus classiques d'un header de type Content-Type, grant_type.
Le requête httpQuery() peut alors être envoyée avec les paramètres $url, 'POST', $post = $payload, $oauth_token = NULL, $header, $use_cookies = false, $ignore_errors = false, &$header_received, $user_pwd = NULL).

oauth2-flow.png
OAuth 2.0 Flow
oauth2-flow.png (36.59 Kio) Consulté 1735 fois


En réponse on obtient une chaine Json avec le token, le token_type et dans le header de la réponse HTTP 200 OK.
Il y a beaucoup de documentation à ce sujet sur internet, j'ai utilisé principalement celle-ci: https://www.rfc-editor.org/rfc/rfc6749.txt
Le script PHP (compatible eedomus ;) ) est disponible pour ceux qui veulent intégrer dans leur PLUGIN une authorisation de type OAuth2.0 authorization Basic et Client Credentials avec un objet connecté ou un site.
Il est important de déclarer dans le script principal:
$client_id=xxxxxx;
$client_secret=yyyyyy;
$header_received=array(timeout=>5);
$uri=<votre url du serveur>;
$oauth_url=<le chemin url pour la demande de token>;

on peut ensuite faire appel à la fonction sdk_OAuth2_basic_client_credentials().
Code : Tout sélectionner
function sdk_OAuth2_basic_client_credentials($host,$oauth_url,$client_id,$client_secret) {
/*
Based on RFC 6749 see https://www.rfc-editor.org/rfc/rfc6749.txt for more details §4.4.  Client Credentials Grant
host      : REQUIRED. Value is the servor url
basicAuth : REQUIRED. Value is base64_encode(client_id:client_secret)
grant_type: REQUIRED. Value MUST be set to "client_credentials".

Input parameters:
   $host           : servor uri
   $oauth_url      : OAuth url
   $client_id      : developper identification
   $client_secret  : developper password
Output parameters:
   $response       : json string containing access_token, token_type
   $header_received: header received from the servor including ERROR code and description

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
  "access_token":"2YotnFZFEjr1zCsicMWpAA",
  "token_type":"example",
  "expires_in":3600,
  "example_parameter":"example_value"
}
*/

global  $header_received;

   $payload = "grant_type=client_credentials";
   $basicAuth = base64_encode(urlencode($client_id).":".urlencode($client_secret));
   $header = array("Accept: application/json", "Authorization: Basic ".$basicAuth, "Content-Type: application/x-www-form-urlencoded");
   $url = $host.$oauth_url;

   $response   = httpQuery($url, 'POST', $payload, NULL, $header, FALSE, FALSE, &$header_received);

   return $response;
}


Vos commentaires sont la bienvenue pour améliorer cette boîte à outils.
Bonne weekend à toutes et tous.
dommarion
Dernière édition par dommarion le 02 Déc 2023 11:44, édité 1 fois.
OpenWeather|Phases soleil|HeatzyV2|Concaténateur|HP Yamaha|SomfyV3|Epson|Seuils n étages|Baie 2 vantaux|Deezer|Intégrale|Authorization Digest|TV Philips|SmartThings|fonction PHP|Tuya Smartlife|CozyTouch2|mySMS
dommarion
 
Messages : 588
Inscription : 28 Déc 2020

Re: Fonction OAuth 2.0 Authorization Basic Client Credential

Messagepar Clara79 » 29 Nov 2023 12:44

Salut, tu nous proposes une fonction pour effectuer le OAuth 2.0 authorization Basic et Client Credentials. C'est cool, merci pour ton partage. Je trouve que ta fonction est bien écrite et documentée, et qu'elle peut être utile pour ceux qui veulent intégrer une authentification de type OAuth2.0 dans leur plugin. J'ai quelques questions et remarques à te faire :

• Est-ce que tu as testé ta fonction avec différents services ou sites qui utilisent le OAuth 2.0 ? Est-ce qu'elle fonctionne bien avec tous les cas de figure ?

• Est-ce que tu as prévu un moyen de gérer les erreurs ou les exceptions qui pourraient survenir lors de la requête httpQuery() ? Par exemple, si le serveur ne répond pas, ou si le token est invalide ou expiré ?

• Est-ce que tu as pensé à sécuriser ton client_id et ton client_secret, qui sont des informations sensibles ? Par exemple, en les stockant dans un fichier crypté ou dans une base de données ?

• Est-ce que tu as envisagé d'utiliser une bibliothèque PHP qui implémente le OAuth 2.0, comme [PHP OAuth 2.0 Client] ou [OAuth 2.0 Client for PHP] ? Cela pourrait te simplifier la vie et t'éviter de réinventer la roue.

Voilà, ce sont mes questions et remarques. J'espère que tu ne les prends pas mal, c'est juste pour t'aider à améliorer ta boîte à outils. Je suis curieux de savoir ce que tu en penses, et si tu as d'autres astuces ou conseils à partager. Bonne journée !
Clara79
 
Messages : 1
Inscription : 20 Nov 2023

Re: Fonction OAuth 2.0 Authorization Basic Client Credential

Messagepar dommarion » 29 Nov 2023 23:12

Bonsoir Clara79,
Merci pour ton intérêt et tes questions.
J’ai testé cette routine sur 2 sites différents: Epson et Enedis. Les 2 répondent bien à la fonction (flux 3 et 4).
Néanmoins dans le corps du programme j’ai effectivement mis un timeout à 5 secondes pour garantir une réponse et éviter que eedomus boucle et stoppe le programme après 30 secondes (voir mon commentaire "Il est important de déclarer dans le script principal:
$client_id=xxxxxx;
$client_secret=yyyyyy;
$header_received=array(timeout=>5);
$uri=<votre url du serveur>;
$oauth_url=<le chemin url pour la demande de token>;
").
Usuellement le cryptage ou l’encapsulage des données client_id et client_secret est réalisé par la team eedomus et n’est pas visible par les utilisateurs. En ce moment la team eedomus ne répond pas trop c’est pourquoi cette fonction est mise en boîte à outils de cette façon. Il est possible de ne laisser dans la fonction que le résultat de base64_encode(client_id:client_secret), ce qui ne change pas grand chose car cette fonction est bijective.
La gestion des erreurs est faite dans le programme principal en décomposant $header_received.
Bonne soirée,
Dommarion
OpenWeather|Phases soleil|HeatzyV2|Concaténateur|HP Yamaha|SomfyV3|Epson|Seuils n étages|Baie 2 vantaux|Deezer|Intégrale|Authorization Digest|TV Philips|SmartThings|fonction PHP|Tuya Smartlife|CozyTouch2|mySMS
dommarion
 
Messages : 588
Inscription : 28 Déc 2020


Retour vers Entraide programmation plugins

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 27 invité(s)

cron