WP-API и Basic Auth возвращают 403 на POST, но работают с GET

24 окт. 2015 г., 00:47:15
Просмотры: 14.1K
Голосов: 2

Я использую последнюю версию WP-API и рекомендуемую Basic Auth для тестирования добавления поста в WordPress удаленно.

На стороне WordPress у меня открыты заголовки доступа:

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

Когда я отправляю GET-запрос по адресу: http://sandbox.ravennainteractive.com/wp-json/wp/v2/posts, запрос успешно аутентифицируется и возвращает пост "Hello World".

Но когда я отправляю POST-запрос на тот же URL, я получаю ошибку. Вот мой jQuery AJAX-запрос:

$('#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('Ваш комментарий успешно добавлен');
        },
        error: function(data){
            console.log(data);
            alert('Произошла ошибка при добавлении комментария');
        }
    });

    return false;
});

Ответ сервера: Failed to load resource: the server responded with a status of 403 (Forbidden)

Array[0]responseText: "[{"code":"rest_forbidden","message":"You don't have permission to do this.","data":{"status":403}}]"

Если я запускаю этот блок кода, удаляя лишнее, запрос работает и возвращает пост "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('Ваш комментарий успешно добавлен');
        },
        error: function(data){
            console.log(data);
            alert('Произошла ошибка при добавлении комментария');
        }
    });

    return false;
});

Как я могу решить эту проблему?

5
Комментарии

Вы пробовали contentType: 'application/json'?

fuxia fuxia
24 окт. 2015 г. 00:57:16

Как сказал toscho, contentType может быть application/json или application/x-www-form-urlencoded. Оба варианта должны работать, но json не является допустимым значением для contentType.

cybmeta cybmeta
24 окт. 2015 г. 08:11:56

Спасибо за комментарии, ни один из этих contentType не решил проблему, но спасибо, что помогли избежать других проблем. Я обновлю оригинальный пост.

TJ Sherrill TJ Sherrill
24 окт. 2015 г. 17:33:52

Пробовали ли вы использовать Postman или Rest Client, чтобы сузить проблему? Убедитесь, что браузер, в котором вы тестируете, не авторизован в вашем WordPress (используйте режим инкогнито или аналогичный). P.S. - как вы отправляете параметры, используя sandbox URL для функции get?

brianlmerritt brianlmerritt
27 окт. 2015 г. 23:16:21

У меня аналогичный опыт в Postman. POST запросы не работают, а GET — работают. Я убедился, что не авторизован, создав специального "apiuser", чтобы исключить пересечение сессий. В случае с GET, так как я просто запрашиваю посты, параметры не передаются — просто пингую URL с GET-запросом.

TJ Sherrill TJ Sherrill
28 окт. 2015 г. 17:41:33
Все ответы на вопрос 1
4

Я столкнулся с такой же проблемой.

...рекомендованная Basic Auth...

Я обнаружил, что проблема в плагине Basic Auth. Разработчики WP-API рекомендуют использовать их собственный плагин, и это решение сработало у меня.

  1. Деактивируйте все активные плагины basic auth в админке WordPress
  2. На сервере, где работает ваш WordPress, перейдите в папку с плагинами
  3. Выполните команду:

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

  4. Перейдите в админку WordPress на страницу плагинов. В списке должен появиться плагин JSON Basic Authentication. Активируйте его.

Теперь создание записи через POST-запрос должно работать.

11 нояб. 2015 г. 17:06:45
Комментарии

Спасибо за заметку, вы пробовали это в последние несколько дней? Я использовал их плагин BasicAuth, видел заметку в документации, что нужно использовать именно их.

TJ Sherrill TJ Sherrill
12 нояб. 2015 г. 17:57:42

Я пробовал это вчера. POST начал работать корректно после установки и активации плагина.

Kirill Feoktistov Kirill Feoktistov
12 нояб. 2015 г. 18:20:50

Последний вопрос, можете поделиться номерами версий плагинов?

TJ Sherrill TJ Sherrill
13 нояб. 2015 г. 18:58:26

Конечно. 'JSON Basic Authentication' - версия 0.1 от команды WordPress API. 'WP REST API' версия 1.2.4 от команды WP REST API (также я пробовал версию 2.0-beta6, аутентификация работала корректно с ней). WordPress версия 4.3.1. Не стесняйтесь задавать любые вопросы.

Kirill Feoktistov Kirill Feoktistov
13 нояб. 2015 г. 19:05:32