Forfaits VoIP - API OVH en PHP : comment s'authentifier par API et obtenir un bearer
... / API OVH en PHP : comment ...
BMPCreated with Sketch.BMPZIPCreated with Sketch.ZIPXLSCreated with Sketch.XLSTXTCreated with Sketch.TXTPPTCreated with Sketch.PPTPNGCreated with Sketch.PNGPDFCreated with Sketch.PDFJPGCreated with Sketch.JPGGIFCreated with Sketch.GIFDOCCreated with Sketch.DOC Error Created with Sketch.
Frage

API OVH en PHP : comment s'authentifier par API et obtenir un bearer

Von
XavierD68
Erstellungsdatum 2024-07-08 16:56:46 (edited on 2024-09-04 11:54:10) in Forfaits VoIP

Bonjour,

nous utilisons l'API d'OVH pour sauvegarder sur nos serveurs les conversations téléphoniques enregistrées. Pour des tas de raisons, nous ne pouvons pas utiliser le PHP wrapper d'OVh (pas d'environnement compatible), mais nous utilisons les commandes cURL données en exemple de chaque API en PHP, et tout fonctionne à merveille.

le code ressemble à ça :
> $ch = curl_init();
>
> curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
> curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
> $headers = array();
> $headers] = 'Accept: application/json';
> $headers[] = 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxx';

> curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

> // CALL API pour récupérer tous les n° de téléphone (alias)
> curl_setopt($ch, CURLOPT_URL, 'https://eu.api.ovh.com/v1/telephony/***compte***/easyHunting');
$lignestel = curl_exec($ch);`

Tout fonctionne très bien... tant que j'ai un bearer acquis avec le bouton AUTHENTICATE de la console API de OVH.

mais je ne parviens pas à trouver de documentation sur la manière d'obtenir ce fichu token directement par API.
Il y a un guide (avec l'utilisation du wrapper OVH) sur le POST /auth/credential, mais la commande cURL ne correspond pas, car il faut envoyer dans la commande une "application key" et un "consumer key", et je ne parviens pas à trouver comment faire.

J'ai déjà mis des heures à trouver la page permettant de générer ces clefs ([c'est là
) , mais maintenant je cale complètement sur la manière des les envoyer via Curl (en PHP) pour obtenir un token.

Quelqu'un aurait-il la solution à ce problème ?


3 Antworten ( Latest reply on 2025-03-24 08:02:40 Von
Xav DYMENSION
)

J'ai un peu progressé sur ce besoin,
j'arrive maintenant à utiliser l'API auth pour tenter de me logguer, mais la réponse de cette API est une URL de connexion avec des boutons, qui me redirige vers la page que je veux SANS me donner le fichu bearer
Ca ne sert donc strictement à rien.

Comment peut-on obtenir le bearer une fois qu'on se connecte ???
> // connexion d'authentification POST ***********************************************
> // CALL API pour s'authentifier - ETAPE 1
>
> $applicationKey = 'xxxxx';
> $applicationSecret = 'xxxxx';
> //$consumerKey = 'xxxxx';
> $requestBody = [
> 'accessRules' => [ ['method' => 'POST', 'path' => '*'] ],
> 'redirection' => 'http://192.168.1.5/idranet/OVH/',
> ]; // 'allowedIPs' => ['xxx.xxx.xxx.xxx/24']

>
> curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
> curl_setopt($ch, CURLOPT_HTTPHEADER, [ "X-Ovh-Application: $applicationKey", "X-Ovh-Application-Secret: $applicationSecret", "Content-Type: application/json", ]); // "X-Ovh-Consumer: $consumerKey",
> curl_setopt($ch, CURLOPT_POST, true);
> curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($requestBody));
>
> curl_setopt($ch, CURLOPT_URL, "https://eu.api.ovh.com/v1/auth/credential");
>
>
> try {
> $response = curl_exec($ch);
> }
> catch (Exception $e) { echo 'Error: ' . $e->getMessage(); }
>
> $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
> if (curl_errno($ch)) echo 'Error:' . curl_error($ch);
>
> if ($httpStatusCode >= 200 && $httpStatusCode < 300) {
> $responseData = json_decode($response, true);
> $validationUrl = $responseData['validationUrl'];
> echo "

SE CONNECTER

";
> }
> else { throw new Exception("HTTP request failed with status code $httpStatusCode and response: $response"); }

RESULTAT :

Bonjour @XavierD68,

Vous trouverez les informations dans le guide suivant:
https://help.ovhcloud.com/csm/fr-api-getting-started-ovhcloud-api?id=kb_article_view&sysparm_article=KB0042789

^FabL

Apres une bonne semaine de recherches, j'ai reussi à m'en sortir grâce à cette doc


1 - créer un user (à faire 1 fois) : 

POST /me/api/oauth2/client

# {
#   "callbackUrls": [],
#   "description": "To allow order",
#   "flow": "CLIENT_CREDENTIALS",
#   "name": "oauth-order-user"
# }

Bien noter le clientId et le clientSecret qui sont renvoyés

2 - récupérer le "bearer" avec : 

auth_token=$(curl -s --request POST \
  --url 'https://www.ovh.com/auth/oauth2/token' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=client_credentials \
  --data client_id=123456123456 \
  --data client_secret=098734sdkfiughhsiep876786 \
  --data scope=all| jq -r '.access_token' )

merci NicoG pour cette contribution, mais ça ne fonctionne pas 

Déjà l'URL https://www.ovh.com/auth/oauth2/token n'existe pas et me renvoie une erreur {"error":"invalid_request"}

Il faut utiliser l'URL de l'API qui est  https://eu.api.ovh.com/v1/auth/token  ,mais je suis surpris qu'il y a 3 mois vous ayez réussi quelque chose avec cette URL.

Ensuite, quand je convertis tout ça en PHP, j'obtiens exactement la même erreur que plus haut (j'avais déjà créé un User et une application et obtenu le ClientID et le ClientSecret... qui ne servent à rien). L'erreur est encore et toujours : {"class":"Client::Unauthorized","message":"You must login first"} 

 

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://eu.api.ovh.com/v1/auth/token');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials&client_id=4a9783d074153ac0&client_secret=4ce59a042dbfee5e4015620acca332be&scope=all|");

$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);

echo "BEARER :".$result;