WP-API y Basic Auth devuelven 403 en POST pero no en GET

24 oct 2015, 00:47:15
Vistas: 14.1K
Votos: 2

Estoy usando la última versión de WP-API y el Basic Auth recomendado, para probar añadir una publicación en WP desde remoto.

Tengo los Access Headers configurados en el lado de WP:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
header("Access-Control-Allow-Headers: Authorization, Content-Type");

Cuando hago una solicitud GET a: http://sandbox.ravennainteractive.com/wp-json/wp/v2/posts la llamada se autentica fácilmente y devuelve la publicación Hello World.

Cuando hago una solicitud POST a la misma URL, obtengo un error. Aquí está mi llamada AJAX con jQuery:

$('#test-post').submit(function(e){
    e.preventDefault();

    var title = $( '#title' ).val();
    var content = $( '#content_raw' ).val();

    var postData = {
        title: title,
        content: content
    }

    console.log(postData);

    $.ajax({
        method: 'POST',
        contentType: 'application/json',
        data: postData,
        url: sandboxUrl,
        beforeSend: function( xhr ) {
           xhr.setRequestHeader ('Authorization', 'Basic '+ btoa( 'apiuser' + ':' + 'PASSWORD' ));
        },
        success: function(data){
            console.log(data);
            alert('Tu comentario se añadió correctamente');
        },
        error: function(data){
            console.log(data);
            alert('Hubo un error al añadir tu comentario');
        }
    });

    return false;
});

La respuesta es: Failed to load resource: the server responded with a status of 403 (Forbidden)

Array[0]responseText: "[{"code":"rest_forbidden","message":"No tienes permiso para hacer esto.","data":{"status":403}}]"

Si ejecuto este bloque de código, eliminando extras innecesarios, la consulta funciona y devuelve la publicación Hello World.

$('#test-post').submit(function(e){
    e.preventDefault();

    $.ajax({
        method: 'GET',
        url: sandboxUrl,
        beforeSend: function( xhr ) {
           xhr.setRequestHeader ('Authorization', 'Basic '+ btoa( 'apiuser' + ':' + 'PASSWORD' ));
        },
        success: function(data){
            console.log(data);
            alert('Tu comentario se añadió correctamente');
        },
        error: function(data){
            console.log(data);
            alert('Hubo un error al añadir tu comentario');
        }
    });

    return false;
});

¿Cómo puedo solucionar esto?

5
Comentarios

¿Has probado con contentType: 'application/json'?

fuxia fuxia
24 oct 2015 00:57:16

contentType puede ser application/json, como dijo toscho, o application/x-www-form-urlencoded. Ambos deberían funcionar pero json no es un valor válido para contentType.

cybmeta cybmeta
24 oct 2015 08:11:56

Gracias por los comentarios, ninguno de esos contentTypes resolvió el problema, pero gracias por ayudarme a evitar otros errores. Actualizaré el post original.

TJ Sherrill TJ Sherrill
24 oct 2015 17:33:52

¿Has probado Postman o Rest Client para reducir el problema? Asegúrate de que el navegador que lo ejecuta no esté conectado a tu sitio WordPress (usa el modo incógnito o similar). PD: ¿cómo estás enviando los parámetros usando la URL sandbox para la función get?

brianlmerritt brianlmerritt
27 oct 2015 23:16:21

Tengo la misma experiencia en Postman. POST falla pero GET funciona. Me he asegurado de cerrar sesión pero creando un "apiuser" para que nunca haya cruce. En el caso del GET, como solo estoy solicitando publicaciones, no hay parámetros, solo haciendo ping a la URL con un GET.

TJ Sherrill TJ Sherrill
28 oct 2015 17:41:33
Todas las respuestas a la pregunta 1
4

Me he encontrado con el mismo problema.

...la autenticación Basic Auth recomendada...

Descubrí que el problema está en el plugin de Basic Auth. Los desarrolladores de WP-API recomiendan usar su propio plugin y esta solución me funcionó.

  1. Desactiva todos los plugins de autenticación básica activos en tu panel de WordPress
  2. En la máquina donde se ejecuta WordPress, ve a la carpeta de plugins
  3. Ejecuta

    git clone https://github.com/WP-API/Basic-Auth.git

  4. Ve al panel de administración de WordPress, a la página de plugins. JSON Basic Authentication debería aparecer en la lista. Actívalo.

Ahora, crear un registro mediante una solicitud POST debería funcionar.

11 nov 2015 17:06:45
Comentarios

Gracias por la nota, ¿probaste esto en los últimos días? Yo estaba usando su plugin BasicAuth, vi la nota en la documentación que decía que tenías que usar el de ellos.

TJ Sherrill TJ Sherrill
12 nov 2015 17:57:42

Lo probé ayer. POST comenzó a funcionar correctamente una vez que instalé y activé el plugin.

Kirill Feoktistov Kirill Feoktistov
12 nov 2015 18:20:50

última pregunta, ¿puedes compartir los números de versión del plugin?

TJ Sherrill TJ Sherrill
13 nov 2015 18:58:26

Claro. 'JSON Basic Authentication' - versión 0.1 por el equipo de WordPress API. 'WP REST API' versión 1.2.4 por el equipo de WP REST API (también probé la versión 2.0-beta6, la autenticación funcionó correctamente con esta). WordPress v 4.3.1. No dudes en preguntar cualquier cosa.

Kirill Feoktistov Kirill Feoktistov
13 nov 2015 19:05:32