Estoy tratando de usar WordPress Rest Api con autenticación para obtener más datos de la API. He instalado el complemento Oauth, el complemento rest-api y obtuve credenciales de API de WP-CLI.
He descubierto cómo acceder a los datos sin autorización. Esto funciona:
// 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>
Pero no puedo entender cómo autenticarme con credenciales. Aquí está mi intento. No estoy seguro de si "clave" y "secreto" son correctos.
// 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 salida es
Array
(
[code] => rest_cannot_read
[message] => Sorry, you cannot view revisions of this post.
[data] => Array
(
[status] => 401
)
)
¿Cómo puedo hacer que esto funcione? Gracias.
authentication
rest-api
curl
JediTricks007
fuente
fuente
Respuestas:
Vamos paso a paso aquí. Parece que está tratando de usar OAuth solo para la autenticación, pero antes de poder hacerlo necesita obtener el token de acceso que se usará para autenticarse cuando realice sus llamadas a la API.
Debido a que está utilizando la versión 1 de OAuth, para obtener el token de acceso debe hacer lo siguiente:
Recomiendo usar Postman para los primeros pasos, ya que solo deben completarse una vez. Postman también se encargará de generar el
timestamp
,nonce
yoauth signature
, por lo tanto, si no está utilizando una biblioteca OAuth, entonces absolutamente debe usar Postman. Una vez que tenga su Token de acceso , puede hacer las llamadas a través de CURL sin ninguna biblioteca.https://www.getpostman.com/
Primer paso (aplicación de configuración)
Instale el complemento WP OAuth 1, actívelo y luego pase al elemento del menú en Usuarios> Aplicaciones . Agregue una nueva aplicación, complete el nombre y la descripción. Para la devolución de llamada, ya sea la URL para redirigir al usuario (después de la autorización) o
oop
para el flujo fuera de banda que redirigirá a una página interna que muestra el token verificador (en lugar de redirigir).https://github.com/WP-API/OAuth1/blob/master/docs/basics/Registering.md
Para continuar con el segundo paso, se debe hacer una llamada a su sitio, utilizando el ID de cliente y el Secreto de cliente de la aplicación creada, para obtener credenciales temporales (Token de solicitud).
Abra Postman, cree una nueva llamada a
http://website.com/oauth1/request
, haga clic en la pestaña Autorización, seleccione OAuth 1.0 del menú desplegable, ingrese la Clave de cliente, Secreto de cliente, configure el método de firma enHMAC-SHA1
, habilite agregar parámetros al encabezado, codifique oauth firma , luego haga clic en Actualizar solicitudPostman generará automáticamente la firma, el nonce y la marca de tiempo para usted, y los agregará al encabezado (puede verlos en la pestaña Encabezados).
Haga clic en Enviar y debería obtener una respuesta que incluya
oauth_token
yoauth_token_secret
:Estos valores se utilizarán en el siguiente paso para autorizar la aplicación en su cuenta de usuario de WordPress.
Segundo paso (autorizar la solicitud)
El paso de autorización solo debe completarse una vez, este paso está orientado al usuario y el que todos conocen. Este paso es obligatorio porque está utilizando OAuth1 y la aplicación debe estar asociada a una cuenta de usuario de WordPress. Piense en cuándo un sitio le permite iniciar sesión con Facebook ... lo dirigen a Facebook donde inicia sesión y hace clic en "Autorizar" ... esto debe hacerse, solo a través de su sitio de WordPress.
Recomiendo usar su navegador web para este paso, ya que puede configurar fácilmente las variables en URL, y esto proporciona la página "Autorizar" para autorizar la aplicación.
Abra su navegador web y escriba la URL de su sitio, así:
http://website.com/oauth1/authorize
Ahora agregue a esta URL,
oauth_consumer_key
(ID de cliente)oauth_token
yoauth_token_secret
(del paso anterior). En mi ejemplo, esta es la URL completa:Una vez que haga clic en Autorizar, obtendrá otra pantalla con el token de verificación. En mi ejemplo, este es el token de verificación devuelto
E0JnxjjYxc32fMr2AF0uWsZm
Tercer paso (obtener token de acceso)
Ahora que hemos autorizado la aplicación, tenemos que hacer una última llamada para obtener el token de autorización que se utilizará para hacer todas sus llamadas API. Al igual que en el primer paso, usaré Postman (porque se requiere que la firma sea HMAC-SHA1), y hace que sea 100 veces más fácil completar estos pasos.
Abra Postman nuevamente y cambie la URL a
http://website.com/oauth1/access
Asegúrese de agregar el token y el token secreto (valores del primer paso), luego haga clic en Parámetros para mostrar los cuadros debajo de la URL. A la izquierda, escriba oauth_verifier y a la derecha, ingrese el código del segundo paso, el token de verificación
Asegúrese de hacer clic en Solicitud de actualización, luego haga clic en Enviar, y debería recibir una respuesta
oauth_token
yoauth_token_secret
... ¡esto es lo que necesita para hacer sus llamadas a la API! Deseche los originales del paso 1, guárdelos en su código o en otro lugar seguro.Luego puede hacer una llamada API a su sitio, configurando los encabezados con el token devuelto y el token secreto.
Puede pasar esto de varias maneras, a través del encabezado de autorización, en los parámetros GET o POST (si está codificado como application / x-www-form-urlencoded). Tenga en cuenta que DEBE pasar la firma, la marca de tiempo y el nonce. No me di cuenta de cuánto tiempo me llevaría esta respuesta, así que lo actualizaré mañana con un ejemplo sobre cómo hacerlo con su código.
Recomiendo instalar el registro Rest API para que pueda ver el registro de las llamadas API y ver lo que se envió, devolvió, etc. Esto ayudará enormemente a la depuración.
https://github.com/petenelson/wp-rest-api-log
fuente
Agregando esto como otra respuesta para ayudarlo a descubrir cómo hacer esto. Básicamente, como se menciona en mis comentarios, si va a usar OAuth1 DEBE asociarlo con una cuenta de usuario, no hay forma de evitarlo.
Primero debe usar CURL para iniciar sesión en el sitio con una contraseña de nombre de usuario para WordPress, almacenar la cookie para poder usarla en su llamada CURL a OAuth (asegúrese de actualizar su llamada CURL para incluir la cookie):
/programming/724107/wordpress-autologin-using-curl-or-fsockopen-in-php
Luego realice la llamada a OAuth usando CURL con el ID de cliente y el Secreto de cliente, para obtener el token y secreto temporal de Oauth (Token de solicitud)
Para realizar esta llamada (y la llamada para obtener el token de acceso), debe configurar su llamada CURL correctamente. Vea el final de esta respuesta para el código y las referencias.
Después de obtener el token o secreto temporal oauth (Token de solicitud), realice una llamada CURL POST a esta URL de su sitio:
http://website.com/oauth1/authorize
A continuación, deberá extraer todos los valores del HTML devuelto para la página de autorización y luego enviar su propia POST a la URL de acción del formulario.
/programming/35363815/how-to-get-a-value-input-from-html-returned-of-curl
Específicamente, estos deben incluirse en sus datos POST para completar la "autorización" POSTing to
http://domain.com/wp-login.php?action=oauth1_authorize
_wpnonce
- Este es el valor nonce para el formulario que se enviará, DEBE extraerse de la entrada HTML y enviarse con su POSTconsumer
- Esta es una entrada oculta en el HTML (esta es una referencia a una ID de publicación, por lo que debe extraerla de la entrada HTMLoauth_token
- Esta es una entrada oculta en el HTML (pero también debería tener esto)wp-submit
- Esto debe establecerse en el valorauthorize
Aquí hay un ejemplo de HTML generado para la página de autenticación:
Después de realizar la POST con todos esos valores / datos, este es el HTML que se devolverá con el código de autorización (por lo que debe extraer el valor desde el interior del
<code>
bloque:Una vez que tenga el token de verificación, puede llamar para
/oauth1/access
usar el token de verificación, el token oauth y el secreto del token oauth. El token de verificación debe colocarse en los datos POST comooauth_verifier
¡Eso devolverá su token de acceso nuevo y permanente, y VOILA!
Código CURL de ejemplo
A continuación se muestra un código de ejemplo para hacer la llamada CURL, la parte más importante es cómo
oauth_signature
se genera:https://oauth1.wp-api.org/docs/basics/Signing.html
Este sitio le dice exactamente cómo codificar la firma OAuth y cómo enviar usando CURL (recomiendo leer la página completa): https://hannah.wf/twitter-oauth-simple-curl-requests-for-your-own- datos/
Más recursos para generar la firma OAuth1: /programming/24613277/oauth-signature-generation-using-hmac-sha1
Otros recursos: http://collaboradev.com/2011/04/01/twitter-oauth-php-tutorial/
fuente
oauth_signature
como me dijiste, pero, de alguna manera, la respuesta es siemprejson_oauth1_signature_mismatch
.Actualización: por lo que he leído, debe hacer múltiples rizos para obtener el acceso_token, que luego usa para hacer la consulta
flujo del servidor oauth1
fuente
Sé que voy a llegar un poco tarde, pero ¿puedes usar wp_remote_get y _post?
Estoy tirando y publicando contenido con mi instalación de WordPress usándolos:
Esta es la idea general del códice de wordpress:
Aquí hay un ejemplo más específico:
El truco es codificar el nombre de usuario y pw. Ahora, a menudo, el tiempo depende del nombre de usuario API y pw estará en blanco o serán sus tokens.
así, por ejemplo, en mi ejemplo específico anterior, los encabezados eran
y dejé pw en blanco. Sin embargo, eso depende del sistema API que esté utilizando.
fuente