WooCommerce - woocommerce_rest_cannot_view - Статус 401

Я создал ключ потребителя и секрет потребителя. На сайте установлен SSL. Я также установил плагины, необходимые для служб JSON и REST. Вот как выглядит URL:

https://<url>/wp-json/wc/v1/products

Когда я пытаюсь получить (ПОЛУЧИТЬ) сведения о продукте с помощью Basic Auth с помощью POSTMAN, плагина Chrome, я получаю ответ JSON, например:

{
  "code": "woocommerce_rest_cannot_view",
  "message": "Sorry, you cannot list resources.",
  "data": {
    "status": 401
  }
}

У меня есть права READ и WRITE, соответствующие ключу Consumer.


person Ram    schedule 12.02.2017    source источник
comment
Проблема решена по этой ссылке :) stackoverflow.com/questions/52102194/   -  person Salahaddin mohammed    schedule 10.04.2021
comment
Проблема решена по этой ссылке :) stackoverflow.com/questions/52102194/   -  person Salahaddin mohammed    schedule 10.04.2021


Ответы (14)


Вы получаете ошибку 401 из-за того, что вы используете базовую аутентификацию, даже если ваш веб-сайт небезопасен (не имеет https).

Решение в почтальоне - использовать OAuth 1.0. Просто добавьте ключ потребителя и секрет потребителя и отправьте запрос.

person Isura Thrikawala    schedule 03.05.2019
comment
Чудесно! Это отлично сработало для меня. Я так сильно боролся с этим аспектом. - person jeremie_se; 31.10.2019
comment
Я пробовал так, но результат тот же. У меня есть https сайт - person Rom-888; 20.12.2020
comment
@ Rom-888 вы выбрали Добавить данные аутентификации в: тело запроса / URL-адрес запроса? - person pegasuspect; 05.01.2021
comment
Часть REST вики WooCommerce помещает неправильную опцию, из-за которой у многих разработчиков возникает проблема с базовой AUTH - person Rach Chen; 21.04.2021

Я встретил ту же проблему.

Вот как я это решаю:

require "woocommerce_api"

woocommerce = WooCommerce::API.new(
  "https://example.com",
  "consumer_key",
  "consumer_secret",
  {
    wp_json: true,
    version: "wc/v1",
    query_string_auth: true
  }
)

Ключ query_string_auth: true, вам необходимо принудительно выполнить базовую аутентификацию, поскольку строка запроса истинна в HTTPS

person Aloha    schedule 27.02.2017
comment
@Aloha, где мне это использовать? пожалуйста, подробно объясните свой ответ. - person devasia2112; 27.01.2019

Попытка помочь другим: я боролся с ответом 401 при попытке CURL, а также с VBA, пытающимся запросить как тип содержимого "application / json". Однако я смог получить действительный ответ, просто введя это в моем браузере адресная строка: https://mywebsite.com/wp-json/wc/v2/products?consumer_key=ck_blahblah&consumer_secret=cs_blahblah

Следуя этой мысли, я вернулся к своему приложению VBA и изменил тип содержимого на «приложение / текст» и смог получить действительный текст ответа с кодом ответа 200. Надеюсь, это кому-то поможет.

person UltimatePeter    schedule 03.09.2017
comment
+1, потому что именно так я получаю почтальон для отправки запроса. Спасибо! на http Он работал с OAuth 1.0. С производственным сервером на https он работает с этим. Действительно странно! - person pegasuspect; 05.01.2021

Попробуйте это, у меня была такая же проблема с библиотекой automattic / woocommerce, и я просто заставил ее работать, добавив к запросу customer_key и customer_secret.

$woocommerce->get("customers/$userId?consumer_key={$this->key}&consumer_secret={$this->secret}");

Быстрое редактирование


Вышеупомянутый метод работает, но я нашел лучшее решение для библиотеки automattic / woocommerce.

Установите для query_string_auth значение true.

Пришлось покопаться в коде, чтобы найти эту настройку.

Ничего не нашел в документации

return new Client($this->url, $this->key, $this->secret, [
    "query_string_auth" => true
]);
person Dieter Gribnitz    schedule 26.04.2019
comment
Спустя долгое время я нашел ваше решение, установив для query_string_auth значение true, и, наконец, я исправил его! Большое спасибо, чувак;) - person papesky; 23.12.2019
comment
@dieter Могу я узнать, в какой файл добавить эти коды? - person Suneth Kalhara; 26.10.2020

Я только что столкнулся с этим. По-видимому, что-то было забавным в том, как curl обрабатывал URL-адрес, поэтому мне пришлось заключить его в двойные кавычки.

Это не сработает: curl https://www.my-site.com/wp-json/wc/v3/orders?consumer_key=ck_40097dbc2844ce7712e1820bcadf0149c2bedegh&consumer_secret=cs_ab57e19263af0b9ab2012396c310f1

person Ryan G    schedule 18.07.2019

Так я перестал волноваться и двинулся дальше.

Короче говоря, у всех остальных контроллеров woocommerce есть метод SOMEWPRESTCLASS::get_item_permissions_check(), который, в свою очередь, вызывает wc_rest_check_post_permissions(), чтобы решить, возвращает ли он эту ошибку;

Итак, вы подключаетесь к этому и проверяете, как хотите:

add_filter( 'woocommerce_rest_check_permissions', 'my_woocommerce_rest_check_permissions', 90, 4 );

function my_woocommerce_rest_check_permissions( $permission, $context, $object_id, $post_type  ){
  return true;
}
person Quickredfox    schedule 18.03.2017
comment
На самом деле это не очень хорошо, потому что таким образом вы открываете дверь каждому! - person B. Martin; 18.07.2018
comment
хотя я знаю об этом риске, сейчас я не могу найти другого решения, спасибо за это. будет использовать как временное исправление - person Zack Cheang Weng Seong; 11.12.2019

Вот измененный ответ на ответ Quickredfox:

add_filter('woocommerce_rest_check_permissions', 'my_woocommerce_rest_check_permissions', 90, 4);

function my_woocommerce_rest_check_permissions($permission, $context, $object_id, $post_type) {
    if($_GET['consumer_key'] == 'asdfghj' && $_GET['consumer_secret'] == 'qwerty') {
        return true;
    }

    return $permission;
}

Обратной стороной этого является то, что теряется гибкость добавления и отмены доступа для пользователей, использующих графический интерфейс. Однако, если ничего не работает, и вы просто не можете понять почему, это сработает и не откроет API для всего мира.

Да, и это требует передачи ключа и секрета в качестве параметров а-ля:

https://foo.bar.com/wp-json/wc/v3/products/123&consumer_key=asdfghj&consumer_secret=qwerty

Это будет работать без https, но если вы используете его без https, помните, что любые учетные данные, которые вы отправляете вместе с вашим запросом, будут отправлены в виде обычного текста.

person Simon Josef Kok    schedule 17.12.2019

Попробуйте сделать запрос, используя параметр запроса, например:

https://www.exemple.com/wp-json/wc/v3/orders?consumer_key=ck_01234567890&consumer_secret=cs_01234567890

здесь: https://www.exemple.com вам нужно будет заполнить свой URL-адрес домена.

здесь: consumer_key and consumer_secret - это ваши ck и cs, которые были ранее сгенерированы в WooCommerce ›Настройки› Дополнительно ›REST API.

person Eduardo de Santana    schedule 15.08.2020

Проблема решена добавлением этой строки ниже в конец файла .htaccess

Все, что вам нужно, добавить эту строку в .htaccess, это работает со мной

SetEnv HTTPS включен

И обязательно используйте OAuth 1.0 для авторизации.

введите описание изображения здесь

person Salahaddin mohammed    schedule 10.04.2021

Для локальной разработки (localhost) вы также можете использовать Basic Auth (например, для Postman) вместо Consumer Key и Consumer Secret. Работает безупречно.

person michal-michalak    schedule 21.02.2020

Вы можете попробовать Oauth 1.0 с почтальоном:

вот скриншот

person sultanmyrza    schedule 26.05.2020

Я только что столкнулся с этим, я получал то же самое сообщение об ошибке, что и OP. Я использовал https и OAuth 1. Проблема заключалась в домене. Я пытался получить доступ example.com, когда правильный домен для сайта был www.example.com.

Этот URL возвращает ошибку 401 woocommerce_rest_cannot_view:

https://example.com/wp-json/wc/v3/products

Этот URL работает и возвращает результаты:

https://www.example.com/wp-json/wc/v3/products
person Collin Krawll    schedule 11.02.2021

Добавьте этот код в function.php, чтобы устранить проблему:

add_filter( 'woocommerce_rest_check_permissions', 'my_woocommerce_rest_check_permissions', 90, 4 );

function my_woocommerce_rest_check_permissions( $permission, $context, $object_id, $post_type  ){
  return true;
}
person us3n    schedule 01.03.2021

в коде node js будет

const WooCommerceRestApi = require("@woocommerce/woocommerce-rest-api").default;
 
const api = new WooCommerceRestApi({
  url: "http://example.com",
  consumerKey: "ck_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  consumerSecret: "cs_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  queryStringAuth: true,
  version: "wc/v3"
});

person ashen madusanka    schedule 05.03.2021