WooCommerce - woocommerce_rest_cannot_view - 状态401

Ram*_*Ram 7 wordpress woocommerce wordpress-rest-api woocommerce-rest-api

我已经生成了一个消费者密钥和消费者秘密.该网站已安装SSL.我还安装了JSON和REST服务所需的插件.这是网址的样子:

https://<url>/wp-json/wc/v1/products
Run Code Online (Sandbox Code Playgroud)

当我试图通过使用Instagram插件(Chrome插件)使用Basic Auth获取(获取)产品详细信息时,我得到一个JSON响应,如:

{
  "code": "woocommerce_rest_cannot_view",
  "message": "Sorry, you cannot list resources.",
  "data": {
    "status": 401
  }
}
Run Code Online (Sandbox Code Playgroud)

我同时拥有与Consumer键对应的READ和WRITE权限.

小智 11

我遇到了同样的问题.

以下是我如何解决它:

require "woocommerce_api"

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

关键是query_string_auth: true 您需要强制基本身份验证作为查询字符串trueHTTPS

  • @Aloha我应该在哪里使用它?请详细说明您的答案。 (2认同)

Qui*_*fox 6

这就是我停止担忧并继续前进的方式。

简而言之,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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这实际上不太好,因为这样你就向所有人敞开了大门! (2认同)

小智 6

您收到的401错误是因为您使用的是基本身份验证,即使您的网站不安全(没有https)。

邮递员中的解决方案是使用OAuth 1.0。只需添加消费者密钥和消费者秘密并发送请求即可。

  • 精彩的!这对我来说非常有效。我在这方面非常挣扎。 (2认同)

Die*_*itz 5

试试这个,我对 automattic/woocommerce 库也有同样的问题,我只是通过将 customer_key 和 customer_secret 附加到查询中来使其工作。

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

快速编辑


上面的方法有效,但我为 automattic/woocommerce 库找到了更好的解决方案。

将query_string_auth设置为true

必须深入研究代码才能找到此设置。

在文档中没有找到任何内容

return new Client($this->url, $this->key, $this->secret, [
    "query_string_auth" => true
]);
Run Code Online (Sandbox Code Playgroud)