J'essaie d'utiliser WordPress Rest Api avec authentification pour obtenir plus de données de l'API. J'ai installé le plugin Oauth, le plugin rest-api et 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 ne peux pas comprendre comment m'authentifier avec des informations d'identification. Voici ma tentative. Je ne sais pas 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 faire en sorte que cela fonctionne? Je vous remercie.
authentication
rest-api
curl
JediTricks007
la source
la source
Réponses:
Allons étape par étape 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 s'authentifier lorsque vous effectuez vos appels d'API.
Dans la mesure où cela utilise OAuth version 1, pour obtenir le jeton d'accès, vous devez procéder comme suit:
Je recommande d'utiliser Postman pour les premières étapes, car elles ne doivent être effectuées qu'une seule fois. Postman gérera également la génération de
timestamp
,nonce
etoauth signature
donc, si vous n'utilisez pas de bibliothèque OAuth, vous devez absolument utiliser Postman. Une fois que vous avez votre jeton d'accès, vous pouvez passer les appels via CURL sans aucune bibliothèque.https://www.getpostman.com/
Première étape (application de configuration)
Installez le plugin WP OAuth 1, activez, puis passez à l'élément de menu sous Utilisateurs> Applications . Ajoutez une nouvelle application, remplissez le nom et la description. Pour le rappel, soit l'URL vers laquelle rediriger l'utilisateur (après l'autorisation), soit
oop
pour le flux hors bande qui redirigera vers une page interne qui affiche le jeton de vérification (au lieu de rediriger).https://github.com/WP-API/OAuth1/blob/master/docs/basics/Registering.md
Pour passer à la deuxième étape, un appel doit être effectué sur votre site, à l'aide de l' ID client et du secret client de l'application créée, pour 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 la clé client, le secret client, définissez la méthode de signature surHMAC-SHA1
, activez ajouter des paramètres à l'en-tête, encodez la signature oauth , puis cliquez sur Mettre à jour la demandePostman générera automatiquement la signature, le nonce et l'horodatage pour vous, et les ajoutera à l'en-tête (vous pouvez voir sous l'onglet En-têtes).
Cliquez sur Envoyer et vous devriez obtenir une réponse qui comprend
oauth_token
etoauth_token_secret
:Ces valeurs seront utilisées à l'étape suivante pour autoriser l'application sous votre compte utilisateur WordPress.
Deuxième étape (autoriser la demande)
L'étape d'autorisation ne doit être effectué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 utilisateur WordPress. Pensez quand un site vous permet de vous connecter avec Facebook ... ils vous dirigent vers Facebook où vous vous connectez et cliquez sur "Autoriser" ... cela doit être fait, simplement via votre site WordPress.
Je recommande d'utiliser votre navigateur Web pour cette étape, car vous pouvez facilement définir les variables dans l'URL, ce qui fournit la page "Autoriser" pour autoriser l'application.
Ouvrez votre navigateur Web et saisissez l'URL de votre site, comme ceci:
http://website.com/oauth1/authorize
Maintenant, ajoutez à cette URL,
oauth_consumer_key
(ID client)oauth_token
etoauth_token_secret
(à partir de l'étape précédente). Dans mon exemple, voici l'URL complète:Une fois que vous cliquez sur Autoriser, vous obtiendrez un autre écran avec le jeton de vérification. Dans mon exemple, c'est le jeton de vérification retourné
E0JnxjjYxc32fMr2AF0uWsZm
Troisième étape (obtenir un jeton d'accès)
Maintenant que nous avons autorisé l'application, nous devons effectuer un dernier appel pour obtenir le jeton d'autorisation qui sera utilisé pour effectuer tous vos appels API. Tout comme la première étape, je vais utiliser Postman (car la signature doit être HMAC-SHA1), et il est 100 fois plus facile de terminer ces étapes.
Ouvrez à nouveau Postman et remplacez l'URL par
http://website.com/oauth1/access
Assurez-vous d'ajouter le Token et le Token Secret (valeurs de la première étape), puis cliquez sur Paramètres pour afficher les cases sous l'URL. À gauche, tapez oauth_verifier et à droite, entrez le code de la deuxième étape, le jeton de vérification
Assurez-vous de cliquer sur Mettre à jour la demande, puis sur Envoyer, et vous devriez obtenir une réponse avec
oauth_token
etoauth_token_secret
... c'est ce dont vous avez besoin pour passer vos appels API! Jetez les originaux de l'étape 1, enregistrez-les dans votre code ou ailleurs en toute sécurité.Vous pouvez ensuite effectuer un appel API à votre site, en définissant les en-têtes avec le jeton retourné et le secret du jeton.
Vous pouvez passer de plusieurs façons, via l'en-tête d'autorisation, 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, donc je mettrai à jour cela demain avec un exemple sur la façon de le faire avec votre code.
Je recommande fortement d'installer le journal d'API Rest afin que vous puissiez afficher le journal des appels d'API et voir ce qui a été envoyé, retourné, etc. Cela vous aidera énormément à déboguer.
https://github.com/petenelson/wp-rest-api-log
la source
Ajouter ceci comme une autre réponse pour vous aider à comprendre comment procéder. Fondamentalement, comme mentionné dans mes commentaires, si vous allez utiliser OAuth1, vous DEVEZ l'associer à un compte d'utilisateur, pas question.
Vous devez d'abord utiliser CURL pour vous connecter au site avec un mot de passe de nom d'utilisateur pour WordPress, stocker le cookie afin que vous puissiez l'utiliser dans votre appel CURL à OAuth (assurez-vous de mettre à jour votre appel CURL pour inclure le cookie):
/programming/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 correctement votre appel CURL. Voir la fin de cette réponse pour le code et les références.
Après avoir obtenu le jeton oauth temporaire et le secret (jeton de demande), effectuez 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.
/programming/35363815/how-to-get-a-value-input-from-html-returned-of-curl
Plus précisément, ceux-ci doivent être inclus dans vos données POST pour terminer le POST "autorisation" à
http://domain.com/wp-login.php?action=oauth1_authorize
_wpnonce
- Ceci est la valeur nonce pour le formulaire à soumettre, cela DOIT être extrait de l'entrée HTML et soumis avec votre POSTconsumer
- Ceci est une entrée cachée dans le HTML (il s'agit d'une référence à un ID de publication, vous devez donc le retirer de l'entrée HTMLoauth_token
- Ceci est une entrée cachée dans le HTML (mais vous devriez aussi déjà l'avoir)wp-submit
- Cela doit être réglé sur la valeurauthorize
Voici un exemple de code HTML généré pour la page d'authentification:
Après avoir effectué le POST avec toutes ces valeurs / données, c'est le code HTML qui sera renvoyé avec le code d'autorisation (vous devez donc extraire la valeur de l'intérieur du
<code>
bloc:Une fois que vous avez le jeton de vérification, vous pouvez ensuite appeler
/oauth1/access
le jeton de vérification, le jeton oauth et le secret du jeton oauth. Le jeton de vérification doit être placé dans les données POST en tant queoauth_verifier
Cela rendra votre nouveau jeton d'accès permanent et VOILA!
Exemple de code CURL
Voici un exemple de code pour effectuer l'appel CURL, la partie la plus importante étant la façon dont le
oauth_signature
est généré:https://oauth1.wp-api.org/docs/basics/Signing.html
Ce site explique exactement comment encoder la signature OAuth et comment envoyer en utilisant CURL (je recommande de lire la page entière): https://hannah.wf/twitter-oauth-simple-curl-requests-for-your-own- Les données/
Plus de ressources sur la génération de signature OAuth1: /programming/24613277/oauth-signature-generation-using-hmac-sha1
Autres ressources: http://collaboradev.com/2011/04/01/twitter-oauth-php-tutorial/
la source
oauth_signature
comme vous l'avez dit mais, en quelque sorte, la réponse est toujoursjson_oauth1_signature_mismatch
.Mise à jour: D'après ce que j'ai lu, vous devez faire plusieurs boucles pour obtenir le access_token, que vous utilisez ensuite pour faire la requête
flux de serveur oauth1
la source
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 les utilisant:
C'est l'idée générale du codex wordpress:
Voici un exemple plus spécifique:
L'astuce consiste à encoder le nom d'utilisateur et pw. Maintenant, le temps dépend souvent du nom d'utilisateur de l'API et pw sera soit vide, soit vos jetons.
Ainsi, par exemple dans mon exemple spécifique ci-dessus, les en-têtes étaient
et j'ai laissé pw vide. Cela dépend du système d'API que vous utilisez.
la source