web-dev-qa-db-fra.com

Comment utiliser l'authentification OAuth avec REST API via les commandes CURL?

J'essaie d'utiliser l'API WordPress Rest avec authentification pour obtenir davantage de données de l'API. J'ai installé le plug-in Oauth, le plug-in rest-api, et j'ai obtenu les informations d'identification de l'API de WP-CLI.

J'ai compris comment accéder aux données sans autorisation. Cela marche:

// set our end point
$domain = "http://localhost/wp-api";
$endpoint = $domain."/wp-json/wp/v2/posts/";


$curl = curl_init($endpoint);

curl_setopt_array($curl, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_URL            => $endpoint,
]);
$response = curl_exec($curl);
$decoderesponse = json_decode($response, true);

?>

<pre>
  <?php print_r($decoderesponse); ?>
</pre>

Mais je n'arrive pas à comprendre comment s'authentifier avec des informations d'identification. Voici ma tentative. Je ne suis pas sûr si "clé" et "secret" sont corrects.

// Oauth credentials from wp-cli
$ID = "4";
$Key = "l8XZD9lX89kb";
$Secret = "UUbcc8vjUkGjuDyvK1gRTts9sZp2N8k9tbIQaGjZ6SNOyR4d";

// set our end point
$domain = "http://localhost/wp-api";
$endpoint = $domain."/wp-json/wp/v2/posts/1/revisions";

$headers[] = "key=$Key";
$headers[] = "secret=$Secret";

$curl = curl_init($endpoint);

curl_setopt_array($curl, [
  CURLOPT_HTTPHEADER     => $headers,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_URL            => $endpoint,
]);
$response = curl_exec($curl);
$decoderesponse = json_decode($response, true);

?>

<pre>
  <?php print_r($decoderesponse); ?>
</pre>

La sortie est

Array
(
    [code] => rest_cannot_read
    [message] => Sorry, you cannot view revisions of this post.
    [data] => Array
        (
            [status] => 401
        )
)

Comment puis-je le faire fonctionner? Je vous remercie.

17
JediTricks007

Allons pas à pas ici. On dirait que vous essayez d'utiliser OAuth uniquement pour l'authentification, mais avant de pouvoir le faire, vous devez obtenir le jeton d'accès qui sera utilisé pour l'authentification lorsque vous passez vos appels d'API.

Comme il utilise OAuth version 1, vous devez procéder comme suit pour obtenir le jeton Access:

  1. Tout d'abord, configurez une application, appelez le site pour obtenir le Request Token (informations d'identification temporaires) à l'aide de l'ID client et du secret de l'application.
  2. Deuxièmement, appelez le site pour autoriser l'application avec le jeton Request de la première étape (en face de l'utilisateur, voir ci-dessous).
  3. Troisièmement, une fois l’autorisation terminée, vous appelez le site pour obtenir le jeton Access (cette application a maintenant été autorisée).

Je recommande d'utiliser Postman pour les premières étapes, car elles ne doivent être complétées qu'une seule fois. Postman se chargera également de générer les variables timestamp, nonce et oauth signature. Si vous n'utilisez pas de bibliothèque OAuth, vous devez absolument utiliser Postman. Une fois que vous avez votre jeton Access, vous pouvez effectuer les appels via CURL sans aucune bibliothèque.

https://www.getpostman.com/

Première étape (application d'installation)

Installez WP plug-in OAuth 1, activez-le, puis passez à l’élément de menu sous Utilisateurs> Applications. Ajouter une nouvelle application, remplir le nom et la description. Pour le rappel, l'URL vers laquelle rediriger l'utilisateur (après autorisation) ou oop pour le flux hors bande, qui redirige vers une page interne qui affiche le jeton du vérificateur (au lieu de la redirection).

https://github.com/WP-API/OAuth1/blob/master/docs/basics/Registering.md

Pour passer à la deuxième étape, vous devez appeler votre site, à l'aide des informations Client ID et Client Secret de l'application créée, afin d'obtenir des informations d'identification temporaires (jeton de demande).

Ouvrez Postman, créez un nouvel appel à http://website.com/oauth1/request, cliquez sur l'onglet Autorisation, sélectionnez OAuth 1.0 dans la liste déroulante, entrez dans la clé du client, secret client, définissez la méthode de signature sur HMAC-SHA1, activez l'ajout de paramètres à l'en-tête, encodez oauth signature, puis cliquez sur demande de mise à jour

 Postman OAuth1 Request 

Postman générera automatiquement la signature, le nonce et l'horodatage et les ajoutera à l'en-tête (vous pouvez les afficher sous l'onglet En-têtes).

Cliquez sur Envoyer et vous devriez obtenir une réponse comprenant oauth_token et oauth_token_secret:  Postman OAuth1 Request Response 

Ces valeurs seront utilisées à l'étape suivante pour autoriser l'application sous votre compte d'utilisateur WordPress.

Deuxième étape (autoriser l'application)

L'étape d'autorisation n'a besoin d'être complétée qu'une seule fois, cette étape est destinée à l'utilisateur et à celle que tout le monde connaît. Cette étape est obligatoire car vous utilisez OAuth1 et l'application doit être associée à un compte d'utilisateur WordPress. Pensez quand un site vous permet de vous connecter avec Facebook ... il vous dirige vers Facebook où vous vous connectez et cliquez sur "Autoriser" ... cela doit être fait, simplement via votre site WordPress.

Je vous recommande d'utiliser votre navigateur Web pour cette étape, car vous pouvez facilement définir les variables dans une URL, ce qui fournit la page "Autoriser" pour autoriser l'application.

Ouvrez votre navigateur Web et tapez l'URL de votre site, comme ceci: http://website.com/oauth1/authorize

Ajoutez maintenant à cette URL, oauth_consumer_key (ID client), oauth_token et oauth_token_secret (de l'étape précédente). Dans mon exemple, il s'agit de l'URL complète:

http://website.com/oauth1/authorize?oauth_consumer_key=TUPFNj1ZTd8u&oauth_token=J98cN81p01aqSdFd9rjkHZWI&oauth_token_secret=RkrMhw8YzXQljyh99BrNHmP7phryUvZgVObpmJtos3QExG1O

 OAuth1 Authorize Application 

Une fois que vous avez cliqué sur Autoriser, vous obtenez un autre écran avec le jeton de vérification. Dans mon exemple, c'est le jeton de vérification renvoyé E0JnxjjYxc32fMr2AF0uWsZm

Troisième étape (obtenir un jeton d'accès)

Maintenant que nous avons autorisé l'application, nous devons faire un dernier appel pour obtenir le jeton d'autorisation qui sera utilisé pour passer tous vos appels d'API. Tout comme la première étape, je vais utiliser Postman (parce que la signature doit être HMAC-SHA1), et cela simplifie 100 fois plus facilement la réalisation de ces étapes.

Ouvrez à nouveau Postman et remplacez l'URL par http://website.com/oauth1/access.

Assurez-vous d'ajouter le jeton et le secret du jeton (valeurs de la première étape), puis cliquez sur Params pour afficher les champs situés sous l'URL. À gauche, entrez oauth_verifier et à droite, entrez le code de la deuxième étape, le jeton Verification.

 Postman OAuth1 Access Step 

Assurez-vous de cliquer sur Demande de mise à jour, puis sur Envoyer et vous devriez obtenir une réponse avec oauth_token et oauth_token_secret ... c'est ce dont vous avez besoin pour passer vos appels d'API! Jetez les originaux de l’étape 1, sauvegardez-les dans votre code ou dans un endroit sûr.

 Postman OAuth1 Access Response 

Vous pouvez ensuite passer un appel API sur votre site en définissant les en-têtes avec le jeton renvoyé et le secret du jeton.

Vous pouvez passer cela de différentes manières, via l'en-tête Authorization, dans les paramètres GET ou POST (si codé en tant qu'application/x-www-form-urlencoded). N'oubliez pas que vous DEVEZ passer la signature, l'horodatage et le nonce. Je ne savais pas combien de temps cette réponse me prendrait, je vais donc la mettre à jour demain avec un exemple d'utilisation de votre code.

Je recommande fortement d'installer le journal Rest API afin de pouvoir consulter le journal des appels d'API et voir ce qui a été envoyé, renvoyé, etc. Cela facilitera considérablement le débogage.

https://github.com/petenelson/wp-rest-api-log

9
sMyles

Ajouter ceci comme une autre réponse pour vous aider à comprendre comment faire cela. Fondamentalement, comme mentionné dans mes commentaires, si vous envisagez d’utiliser OAuth1, vous DEVEZ l’associer à un compte utilisateur.

Vous devez d’abord utiliser CURL pour vous connecter au site avec un nom d’utilisateur mot de passe pour WordPress. Stockez le cookie pour pouvoir l’utiliser dans votre appel CURL vers OAuth (veillez à mettre à jour votre appel CURL afin d’inclure le cookie):

https://stackoverflow.com/questions/724107/wordpress-autologin-using-curl-or-fsockopen-in-php

Appelez ensuite OAuth à l'aide de CURL avec l'ID client et le secret client, pour obtenir le jeton oauth temporaire et le secret (jeton de demande).

Pour effectuer cet appel (et l'appel pour obtenir un jeton d'accès), vous devez configurer votre appel CURL correctement. Voir la fin de cette réponse pour le code et les références.

Une fois que vous avez obtenu le jeton oauth temporaire et le secret (jeton de demande), lancez un appel CURL POST à cette URL de votre site:

http://website.com/oauth1/authorize

Vous devrez ensuite extraire toutes les valeurs du code HTML renvoyé pour la page d'autorisation, puis soumettre votre propre POST à l'URL de l'action de formulaire.

https://stackoverflow.com/questions/35363815/how-to-get-a-value-input-from-html-returned-of-curl

Celles-ci doivent en particulier être incluses dans vos données POST pour que l’autorisation "autorisation" soit affectée à http://domain.com/wp-login.php?action=oauth1_authorize.

  • _wpnonce - Il s’agit de la valeur de nonce du formulaire à soumettre, elle DOIT être extraite de l’entrée HTML et soumise avec votre POST.

    consumer - Il s’agit d’une entrée cachée dans le code HTML (il s’agit d’une référence à un ID de publication; vous devez donc la extraire de l’entrée HTML

    oauth_token - Ceci est une entrée cachée dans le HTML (mais vous devriez aussi déjà l'avoir)

    wp-submit - Ceci doit être défini sur la valeur authorize

Voici un exemple de code HTML généré pour la page d'authentification:

<form name="oauth1_authorize_form" id="oauth1_authorize_form" action="http://website.com/wp-login.php?action=oauth1_authorize" method="post">

    <h2 class="login-title">Connect My Auth</h2>

    <div class="login-info">
        <p>Howdy <strong>admin</strong>,<br/> "My OAuth Demo" would like to connect to Example Site.</p>

    </div>

    <input type="hidden" name="consumer" value="5428" /><input type="hidden" name="oauth_token" value="i1scugFXyPENniCP4kABKtGb" /><input type="hidden" id="_wpnonce" name="_wpnonce" value="ca9b267b4f" /><input type="hidden" name="_wp_http_referer" value="/wp-login.php?action=oauth1_authorize&amp;oauth_consumer_key=TUPFNj1ZTd8u&amp;oauth_token=i1scugFXyPENniCP4kABKtGb&amp;oauth_token_secret=gzqW47pHG0tilFm9WT7lUgLoqN2YqS6tFFjUEiQoMgcmG2ic" />   <p class="submit">
        <button type="submit" name="wp-submit" value="authorize" class="button button-primary button-large">Authorize</button>
        <button type="submit" name="wp-submit" value="cancel" class="button button-large">Cancel</button>
    </p>

</form>

Une fois que vous avez créé le POST avec toutes ces valeurs/données, il s'agit du code HTML qui sera renvoyé avec le code d'autorisation (vous devez donc extraire la valeur à l'intérieur du bloc <code>:

<div id="login">
    <h1><a href="https://wordpress.org/" title="Powered by WordPress" tabindex="-1">Example Site</a></h1>
    <p>Your verification token is <code>yGOYFpyawe8iZmmcizqVIw3f</code></p> <p id="backtoblog"><a href="http://website.com/">&larr; Back to Example Site</a></p>
</div>

Une fois que vous avez le jeton de vérification, vous pouvez ensuite appeler /oauth1/access à l'aide du jeton de vérification, du jeton oauth et du secret du jeton oauth. Le jeton de vérification doit être placé dans les données POST sous la forme oauth_verifier

Cela vous retournera votre nouveau et permanent jeton d’accès, et VOILA!

Exemple de code CURL

Vous trouverez ci-dessous un exemple de code pour effectuer l'appel CURL, la partie la plus importante étant la manière dont le oauth_signature est généré:

https://oauth1.wp-api.org/docs/basics/Signing.html

function buildBaseString($baseURI, $method, $params){
    $r = array();
    ksort($params);
    foreach($params as $key=>$value){
        $r[] = "$key=" . rawurlencode($value);
    }

    return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}

function buildAuthorizationHeader($oauth){
    $r = 'Authorization: OAuth ';
    $values = array();
    foreach($oauth as $key=>$value)
        $values[] = "$key=\"" . rawurlencode($value) . "\"";

    $r .= implode(', ', $values);
    return $r;
}

// Add request, authorize, etc to end of URL based on what call you're making
$url = "http://domain.com/oauth/";

$consumer_key = "CLIENT ID HERE";
$consumer_secret = "CLIENT SECRET HERE";

$oauth = array( 'oauth_consumer_key' => $consumer_key,
                'oauth_nonce' => time(),
                'oauth_signature_method' => 'HMAC-SHA1',
                'oauth_callback' => 'oob',
                'oauth_timestamp' => time(),
                'oauth_version' => '1.0');

$base_info = buildBaseString($url, 'GET', $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;


$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
                  CURLOPT_HEADER => false,
                  CURLOPT_URL => $url,
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_SSL_VERIFYPEER => false);

$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$return_data = json_decode($json);

print_r($return_data);

Ce site explique exactement comment encoder la signature OAuth et comment envoyer à l'aide de CURL (je recommande de lire toute la page): https://hannah.wf/Twitter-oauth-simple-curl-requests-for-your- données propres/

Plus de ressources sur la génération de la signature OAuth1: https://stackoverflow.com/questions/24613277/oauth-signature-generation-using-hmac-sha1

Autres ressources: http://collaboradev.com/2011/04/01/Twitter-oauth-php-tutorial/

2
sMyles

Mise à jour: D'après ce que j'ai lu, vous devez utiliser plusieurs boucles pour obtenir le code d'accès, que vous utiliserez ensuite pour effectuer la requête.

  • Acquisition d'informations d'identification temporaires: le client obtient un ensemble d'informations d'identification temporaires du serveur.
  • Autorisation: l'utilisateur "autorise" le jeton de demande à accéder à son compte.
  • Échange de jetons: le client échange les informations d'identification temporaires de courte durée contre un jeton de longue durée.

Flux du serveur oauth1

0
juz

Je sais que j'arrive un peu tard, mais pouvez-vous utiliser wp_remote_get et _post?

Je tire et publie du contenu avec mon installation wordpress en utilisant:

C’est l’idée générale du codex wordpress:

$response = wp_remote_post( $url, array(
    'body'    => $data,
    'httpversion' => '1.0',
    'sslverify' => false,
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode( $username . ':' . $password ),
    ),
) );

Voici un exemple plus spécifique:

$url='http://WWW.EXAMPLE HERE.';
$response = wp_remote_post( $url, array(
    'method' => 'POST',
    'timeout' => 45,
    'redirection' => 5,
    'httpversion' => '1.0', //needed to get a response
    'blocking' => true,
    'headers' => array('Authorization' => 'Basic ' . base64_encode( 'MY TOKENID' . ':' . '' )),
    'body' => $body // in array
    'cookies' => array()
    )
);

if ( is_wp_error( $response ) ) {
   $error_message = $response->get_error_message();
   echo "Something went wrong: $error_message";
} else {
 //  echo 'Response:<pre>';
 //  print_r( $response );
 //    echo '</pre>'; 
$responseBody = json_decode($response['body'],true);
echo $responseBody['message'];

    }
    }
}

L'astuce consiste à encoder le nom d'utilisateur et le pw. Maintenant, souvent, le temps en fonction du nom d'utilisateur de l'API et pw sera vide ou sera vos jetons.

ainsi, par exemple, dans mon exemple spécifique ci-dessus, les en-têtes étaient

'headers' => array('Authorization' => 'Basic ' . base64_encode( 'MYTOKENID' . ':' . '' ))

et j'ai laissé pw vierge. Cela dépend toutefois du système API que vous utilisez.

0
rudtek