Cómo: realizar solicitudes autenticadas por JWT a la API de Wordpress

17

Esto no es realmente una pregunta, sino una guía sobre cómo realizar solicitudes autenticadas a la API de Wordpress utilizando JWT. Estoy escribiendo esto como un recordatorio para mí y para aquellos que pueden necesitar ayuda con el mismo tema.

grazianodev
fuente
3
Debe formatear esto como una pregunta, luego publicar la solución como una respuesta real. De lo contrario, parece una pregunta sin respuesta.
Jacob Peattie
2
También hay esta excelente guía firxworx.com/blog/wordpress/…
Armando

Respuestas:

19

Por qué la autenticación JWT

Estoy construyendo un sitio que usa Wordpress como back-end y una aplicación React + Redux como front-end, por lo que estoy sacando todo el contenido en el front-end haciendo solicitudes a la API de Wordpress. Algunas solicitudes (principalmente, solicitudes POST) deben autenticarse, que es cuando me encontré con JWT.

Lo que necesitamos

Para usar la autenticación JWT con Wordpress, primero debemos instalar la autenticación JWT para el complemento API WP REST . Como se explica en las instrucciones del complemento, también debemos modificar algunos archivos principales de Wordpress. En particular:

En el archivo .htaccess incluido en la carpeta raíz de la instalación de Wordpress, necesitamos agregar las siguientes líneas:

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

En el archivo wp-config.php, también incluido en la carpeta raíz de la instalación de Wordpress, necesitamos agregar estas líneas:

define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); // Replace 'your-top-secret-key' with an actual secret key.
define('JWT_AUTH_CORS_ENABLE', true);

Prueba para ver si JWT está disponible

Para verificar que ahora podemos usar JWT, inicie Postman y haga una solicitud al 'índice' predeterminado de la API de Wordpress:

http://example.com/wp-json/

Algunos puntos finales nuevos, como /jwt-auth/v1y /jwt-auth/v1/tokendeberían haberse agregado a la API. Si puede encontrarlos en la respuesta a la solicitud anterior, significa que JWT ahora está disponible.

Obteniendo el token JWT

Quedémonos en Postman por el momento y solicitemos un token a la API de Wordpress:

http://example.com/wp-json/jwt-auth/v1/token

La respuesta contendrá el token JWT, que es una clave cifrada que se parece a esto:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

Hacer una solicitud autenticada

Intentemos cambiar el título de una publicación con una ID de 300 como ejemplo de una solicitud autenticada con JWT.

En Cartero, elija POST como método y escriba el siguiente punto final:

http://example.com/wp-json/wp/v2/posts/300

Elija Sin autenticación en la pestaña Autorización y agregue lo siguiente en la pestaña Encabezados:

'Content-type': 'application/json', 
'Authorization': 'Bearer jwtToken' // Replace jwtToken with the actual token (the encrypted key above)

Finalmente, en la pestaña Cuerpo, seleccione las opciones sin formato y JSON (aplicación / json), luego en el editor justo debajo de las opciones, escriba lo siguiente:

{ "title": "YES! Authenticated requests with JWT work" }

Ahora puedes presionar ENVIAR. Mire en la pestaña de respuestas con todos los datos sobre la publicación que solicitamos: el valor de la clave de título ahora debería serYES! Authenticated requests with JWT work

grazianodev
fuente
2
¿Cómo distinguiría entre las llamadas que deben autenticarse y las que no tienen que autenticarse en el back-end?
uruk
También estoy creando una aplicación React que extrae los datos de las publicaciones de la base de datos de WordPress usando la API REST de WordPress, sin embargo, no quiero tener los puntos finales de la API REST disponibles públicamente. ¿Hay alguna manera de restringir el acceso a la API REST a excepción de mi aplicación React?
Chris
@ Chris Si desea que sus puntos finales que se oculta lejos de las solicitudes no autorizadas, añadirlos bajo el espacio de nombres jwt_auth, es decir, de este modo: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... . Cualquier cosa bajo / jwt-auth / necesitará autorización
Athoxx
4

Complementando la respuesta de @grazianodev, así es como obtienes tu token de autorización usando cURL:

/**
*   Generate a JWT token for future API calls to WordPress
*/
private function getToken() {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL,'https://site.localhost/wp-json/jwt-auth/v1/token');
    curl_setopt($ch, CURLOPT_POST, 1);

    # Admin credentials here
    curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass"); 

    // receive server response ...
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec ($ch);
    if ($server_output === false) {
        die('Error getting JWT token on WordPress for API integration.');
    }
    $server_output = json_decode($server_output);

    if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }

    if (!empty($server_output->token)) {
        $this->token = $server_output->token; # Token is here
        curl_close ($ch);
        return true;
    } else {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }
    return false;
}

Después de eso, envíe sus solicitudes con el encabezado: "Autorización: portador $ token"

Donde $ token es el token devuelto por la función getToken () anterior.

Personalmente utilizo el complemento " Desactivar API REST y requerir autenticación JWT / OAuth " para restringir el acceso a la API solo con el token anterior.

Lucas Bustamante
fuente