Utilisation d'API Adobe

Utilisation d'API Adobe - PHP - Programmation

Marsh Posté le 25-06-2020 à 22:11:25    

Bonjour à tous,
 
je tourne en rond depuis quelques jours sur un souci d'API Adobe, j'ai peut-être manqué un truc ...
Je poste un message au cas où ...
 
J'ai une console admin dont les utilisateurs sont organisés en groupes.
mon but: je souhaite créer un compte (et le mettre dans un groupe) ou en modifier un compte (càd changer de groupe) par l'API.
 
 
La doc est ici : https://adobe-apiplatform.github.io [...] tml#update
L'authentification est en BEARER et cette partie fonctionne puisque via l'API je peux lister les comptes et les groupes.
 
 
j'ai un user test (de type EnterpriseID) dont je connais le login, le groupe actuel, etc.
Je souhaite le faire passer dans un autre groupe, mais rien ne semble fonctionner. La création non plus d'ailleurs :(
 
Voilà de quoi je pars :
 
- un environnement PHP 7 (pas de framework particulier)
- une page contenant une classe arbitrairment nommée "AdobeAPI" (instanciée puis dont les méthodes sont appelées).
 
==> cette classe dispose entres autres des méthodes suivantes :
1) les méthodes fournies par la doc exemple Adobe pour la création d'un token JWT (cette partie fonctionne)
2) une méthode ListUsers qui initie le token JWT et envoie une requête GET pour récupérer la liste des comptes utilisateurs - cette méthode fonctionne ;
3) une méthode "sendRequest" qui est chargée d'interroger en GET justement  
 

Code :
  1. public function sendRequest($url, $method, $values, $header) {
  2. $options = array(
  3.  'http' => array(
  4.   'header'  => $header,
  5.   'method'  => $method,
  6.   'content' => http_build_query($values)
  7.  )
  8. );
  9. echo '*** send-'.$method.'-Request *** ';
  10. // echo 'URL='.url;
  11. // echo 'OPTIONS='; echo '<pre>'; print_r($options); echo '</pre>';
  12. $context  = stream_context_create($options);
  13. var_dump($context);
  14. $result = file_get_contents($url, false, $context);
  15. return $result;
  16. }


 
 
4) ma méthode "UpdateUser" qui est censée dans un premier temps ajouter le user dans un nouveau groupe :
 

Code :
  1. public function UpdateUser($array_userData) {
  2. // init token
  3. $array_token = $this->init_auth(); // création du JWT, cette partie fonctionne
  4. $host = 'usermanagement.adobe.io';
  5. $endpoint = '/v2/usermanagement';
  6. $ims_host = 'ims-na1.adobelogin.com';
  7. $ims_endpoint_jwt = '/ims/exchange/jwt';
  8. # source : https://github.com/adobe-apiplatfor [...] iseUser.py
  9. $url = "https://" . $host . $endpoint . "/action/" . INT_ADOBEAPI_ORG_ID;
  10. $header  = "Content-type: application/x-www-form-urlencoded\r\n";
  11. $header .= "cache-control: no-cache\r\n";
  12. $header .= "Accept: application/json\r\n";
  13. $header .= "x-api-key: ".INT_ADOBEAPI_API_KEY."\r\n";
  14. $header .= "Authorization: Bearer ".$array_token['access_token'];
  15. $response = $this->sendRequest($url, 'POST', array($array_userData), $header);
  16. // print response
  17. var_dump($response);
  18. return $response;
  19. }


 
pas d'erreur dans le log Apache.
voici le retour affiché :  
 

Citation :


*** send-POST-Request ***  
 
{"errorMessage":""}
 
string(19) "{"errorMessage":""}"
 
{"errorMessage":""}


 
 
Pour info, le tableau $array_userDAta envoyé :

Code :
  1. $array_userData = array();
  2. $array_userData['user'] = 'compte_de_test@domaine.com'; // EnterpriseID
  3. $array_userData['requestID'] = 'action_1'; // ?
  4. $array_userData['do'] = array(); //
  5. $array_userData['do'][0]['add'] = array(); //
  6. $array_userData['do'][0]['add']['group'] = array('GROUP_USERS'); // ce groupe existe bien sur
  7. $myClass->UpdateUser($array_userData);


 
 
Dans la doc (https://adobe-apiplatform.github.io/umapi-documentation/en/api/ActionsCmds.html#update) j'ai cet exemple de json pour l'update user :
 

Code :
  1. [{
  2.   "user": "jdoe@claimed-domain1.com",
  3.   "requestID": "action_1",
  4.   "do": [{
  5.     "add": {
  6.       "group": [
  7.         "group_name1",
  8.         "group_name2"
  9.       ]
  10.     }
  11.   }]
  12. }]


 
c'est pour ça que dans la méthode UpdateUSer je l'ai mis dans un array : en json_encode, ça donne exactement les mêmes lignes.
 
J'ai l'impression que le file_get_contents est bon pour les GET et pas pour les POST, j'ai donc fait un 2è essai :
 

Code :
  1. public function sendRequest($url, $method, $values, $header) {
  2. $options = array(
  3.  'http' => array(
  4.   'header'  => $header,
  5.   'method'  => $method,
  6.   'content' => http_build_query($values)
  7.  )
  8. );
  9. echo '*** send-'.$method.'-Request *** ';
  10. // echo 'URL='.url;
  11. // echo 'OPTIONS='; echo '<pre>'; print_r($options); echo '</pre>';
  12. if ($method == 'GET')
  13. {
  14.  $context  = stream_context_create($options);
  15.  var_dump($context);
  16.  $result = file_get_contents($url, false, $context);
  17. }
  18. else // post, put
  19. {
  20.  # source https://weichie.com/blog/curl-api-calls-with-php/
  21.  $curl = curl_init();
  22.  switch ($method)
  23.  {
  24.   case 'POST':
  25.    curl_setopt($curl, CURLOPT_POST, 1);
  26.    if ($values)
  27.     curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($values));
  28.    break;
  29.   case 'PUT':
  30.    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
  31.    if ($values)
  32.     curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($values));
  33.    break;
  34.   default:
  35.    if ($values)
  36.     $url = sprintf("%s?%s", $url, http_build_query($values));
  37.  }
  38.  // OPTIONS:
  39.  curl_setopt($curl, CURLOPT_URL, $url);
  40.  curl_setopt($curl, CURLOPT_HTTPHEADER, explode("\r\n", $header));
  41.  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  42.  curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  43.  // EXECUTE:
  44.  $result = curl_exec($curl);
  45.  if(!$result)
  46.  {
  47.   die('Connection Failure');
  48.  }
  49.  curl_close($curl);
  50. }
  51. var_dump($result);
  52. return $result;
  53. }


 
mais sans plus de succès ...
 
je pense que le pb vient de ma méthode "sendRequest" : soit je ne lui donne pas à manger la variable correctement écrite, soit le traitement avec l'API adobe n'est pas bon. Mais je n'arrive pas à départager ... Si quelqu'un a une piste, je suis preneur !
Merci d'avance pour toute aide :-)

Reply

Marsh Posté le 25-06-2020 à 22:11:25   

Reply

Marsh Posté le 26-06-2020 à 08:08:41    

:hello:
merci pour ta réponse ! j'avais bien mis ce accept: application/json dans la capture, il était 2 lignes plus bas.
 
en enlevant le form-urlencoded, donc en laissant la méthode ainsi :
 

Code :
  1. public function UpdateUser($array_userData) {
  2. // init token
  3. $array_token = $this->init_auth();
  4. $host = 'usermanagement.adobe.io';
  5. $endpoint = '/v2/usermanagement';
  6. $ims_host = 'ims-na1.adobelogin.com';
  7. $ims_endpoint_jwt = '/ims/exchange/jwt';
  8. $url = "https://" . $host . $endpoint . "/action/" . INT_ADOBEAPI_ORG_ID;
  9. //$header  = "Content-type: application/x-www-form-urlencoded\r\n";
  10. $header = '';
  11. $header .= "Accept: application/json\r\n";
  12. $header .= "cache-control: no-cache\r\n";
  13. $header .= "x-api-key: ".INT_ADOBEAPI_API_KEY."\r\n";
  14. $header .= "Authorization: Bearer ".$array_token['access_token'];
  15. $response = $this->sendRequest($url, 'POST', array($array_userData), $header);
  16. // print response
  17. var_dump($response);
  18. }


 
et avec le SendRequest "forme longue" (donc tous les cURL pour la méthode POST), même erreur :
 

Citation :


*** send-POST-Request ***  
 
string(19) "{"errorMessage":""}" string(19) "{"errorMessage":""}"
 
{"errorMessage":""}


 
 
avec le sendRequest "forme courte" (donc cURLless = stream_content + file_get_contents) j'ai ce retour :
 

Citation :


*** send-POST-Request ***  
 
resource(41) of type (stream-context)
Notice: file_get_contents(): Content-type not specified assuming application/x-www-form-urlencoded in C:\Users\...\Adobeapi.php on line 240
 
Warning: file_get_contents(https://...@AdobeOrg): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in C:\Users\...\Adobeapi.php on line 240
bool(false) bool(false)  

Reply

Marsh Posté le 26-06-2020 à 23:15:45    


Bah si, 3 lignes plus bas :o

Reply

Marsh Posté le 27-06-2020 à 11:51:01    


 
tu peux argumenter ?
je fais référence à la ligne entourée en rouge dans ta capture en dessous de celle que tu as encadrée :
https://reho.st/self/ec89c96b49ce1cb7f4e566f7a9d444905e69a360.png
 
mais si ça se trouve c'est d'ailleurs que tu parles et c'est p'tet ce que j'ai manqué ...?

Reply

Marsh Posté le 27-06-2020 à 21:23:17    

jusrtement, je ne suis pas sûr de mon coup, n'étant pas un familier de ces requêtes.
 
Alors je viens de faire 2 essais :
 
la méthode update comme suit :

Code :
  1. public function UpdateUser($array_userData) {
  2. // init token
  3. $array_token = $this->init_auth();
  4. $host = 'usermanagement.adobe.io';
  5. $endpoint = '/v2/usermanagement';
  6. $ims_host = 'ims-na1.adobelogin.com';
  7. $ims_endpoint_jwt = '/ims/exchange/jwt';
  8. $url = "https://" . $host . $endpoint . "/action/" . INT_ADOBEAPI_ORG_ID;
  9. $header  = '';
  10. $header .= "Content-type: application/json\r\n";
  11. $header .= "Cache-control: no-cache\r\n";
  12. $header .= "x-api-key: ".INT_ADOBEAPI_API_KEY."\r\n";
  13. $header .= "Authorization: Bearer ".$array_token['access_token'];
  14. $response = $this->sendRequest($url, 'POST', array($array_userData), $header);
  15. // print response
  16. var_dump($response);
  17. }


 
et le sendRequest avec le code court :

Code :
  1. $context  = stream_context_create($options);
  2.  var_dump($context);
  3.  $result = file_get_contents($url, false, $context);


 
résultat :
 

Citation :

*** send-POST-Request ***  
 
resource(41) of type (stream-context)
Warning: file_get_contents(https://...@AdobeOrg): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in C:\Users\...\Adobeapi.php on line 240
bool(false)


 
maintenant avec le send request + curl :
[

Citation :


*** send-POST-Request ***  
 
string(75) "{"completed":1,"notCompleted":0,"completedInTestMode":0,"result":"success"}" string(75) "{"completed":1,"notCompleted":0,"completedInTestMode":0,"result":"success"}"
 
{"completed":1,"notCompleted":0,"completedInTestMode":0,"result":"success"}


 
j'ai l'impression que ça a fonctionné.  :bounce:  
je pense que c'est cette subtilité à côté de laquelle j'étais passé ! Merci pour le tuyau, je vais creuser... Je reviendrai poster dès que je me serai assuré que ça fonctionne réellement !


Message édité par petit pedestre le 27-06-2020 à 21:23:48
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed