【问题标题】:WooCommerce - woocommerce_rest_cannot_view - Status 401WooCommerce - woocommerce_rest_cannot_view - 状态 401
【发布时间】:2017-06-30 10:01:09
【问题描述】:

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

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

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

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

我拥有与 Consumer 键对应的 READ 和 WRITE 权限。

【问题讨论】:

标签: wordpress woocommerce woocommerce-rest-api wordpress-rest-api


【解决方案1】:

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

postman 中的解决方案是使用 OAuth 1.0。只需添加消费者密钥和消费者密钥并发送请求。

【讨论】:

  • 太棒了!它对我很有用。我在这方面苦苦挣扎。
  • 我试过这种方式,但结果还是一样。我有一个 https 网站
  • @Rom-888 您是否选择了将身份验证数据添加到:请求正文/请求 URL?
  • WooCommerce wiki REST 部分放置了错误的选项,导致许多开发人员在基本 AUTH 上遇到此问题
【解决方案2】:

我遇到了同样的问题。

我是这样解决的:

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 下强制将基本身份验证作为查询字符串为真

【讨论】:

  • @Aloha 我应该在哪里使用它?请详细解释你的答案。
【解决方案3】:

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

简而言之,woocommerce rest 控制器几乎都有一个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;
}

【讨论】:

  • 这其实不太好,因为这样你就给大家开门了!
  • 虽然我知道这样做有风险,但我现在找不到任何其他解决方案,谢谢。将用作临时修复
【解决方案4】:

试图帮助他人: 我在尝试 CURL 时遇到了 401 响应,并且 VBA 尝试请求内容类型为“application/json” 但是,我可以通过在浏览器地址栏中输入以下内容来获取有效响应: https://mywebsite.com/wp-json/wc/v2/products?consumer_key=ck_blahblah&consumer_secret=cs_blahblah

按照这个思路,我回到了我的 VBA 应用程序并将内容类型更改为“应用程序/文本”,并且能够提取响应代码为 200 的有效响应文本。 希望这对某人有所帮助。

【讨论】:

  • +1 因为这是我让邮递员发送请求的方式。谢谢!在 http 它正在使用 OAuth 1.0。使用 https 上的生产服务器,它适用于此。真的很奇怪!
【解决方案5】:

试试这个,我在 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
]);

【讨论】:

  • 经过很长时间,我找到了将 query_string_auth 设置为 true 的解决方案,最后我修复了它!非常感谢,伙计;)
  • @dieter 我能知道哪个文件附加这些代码吗
【解决方案6】:
【解决方案7】:

通过将下面这一行添加到 .htaccess 文件的末尾来解决问题

你只需要将此行添加到 .htaccess 中,这对我有用

SetEnv HTTPS 开启

并确保使用 OAuth 1.0 进行授权

【讨论】:

    【解决方案8】:

    这是对 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;
    }
    

    这样做的缺点是失去了为使用 gui 的用户添加和撤销访问权限的灵活性。但是,如果没有其他方法起作用并且您只是无法弄清楚原因,那么这将起作用并且不会将 API 暴露给全世界。

    哦,这需要将密钥和秘密作为参数传递:

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

    这将在没有 https 的情况下工作,但如果您在没有 https 的情况下使用它,请记住您随请求一起发送的任何凭据都将以纯文本形式发送。

    【讨论】:

      【解决方案9】:

      您可以使用邮递员尝试 Oauth 1.0:

      【讨论】:

        【解决方案10】:

        尝试使用查询参数发出请求,如下所示:

        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 是您之前在 WooCommerce > 设置 > 高级 > REST API 上生成的 ck 和 cs

        【讨论】:

          【解决方案11】:

          对于本地开发 (localhost),您还可以使用 Basic Auth(例如 Postman)而不是 Consumer Key 和 Consumer Secret。它可以无缝运行。

          【讨论】:

            【解决方案12】:

            我刚刚遇到了这个问题,我收到了与 OP 完全相同的错误消息。我使用的是 https 和 OAuth 1。问题最终出在域上。当站点的正确域是 www.example.com 时,我试图访问 example.com。

            此网址返回 401 woocommerce_rest_cannot_view 错误:

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

            此 URL 有效并返回结果:

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

            【讨论】:

              【解决方案13】:

              将此代码添加到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;
              }
              

              【讨论】:

                【解决方案14】:

                在节点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"
                });

                【讨论】:

                  猜你喜欢
                  • 2019-02-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-05-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-06-02
                  • 2017-01-26
                  相关资源
                  最近更新 更多