2

私は、ユーザーがWooCommerceストアを自分のサイトに統合できるようにするアプリを書いています。私はPython wrapper for the WooCommerce REST APIを使用しており、私のアプリはGoogle App Engine上でホストされています。 Woocommerce APIを呼び出すコードは次のとおりです。 WooCommerce APIはGoogle App Engineで401を提供しますが、ローカルenvで動作します(200 OK)

def request_woo_api(self, user, request_url): 
     wcapi = API(
      url=user.woo_url, 
      consumer_key=user.woo_consumer_key, 
      consumer_secret=user.woo_consumer_secret, 
      wp_api=True, 
      version="wc/v2", 
      query_string_auth=True 
      ) 
     resp = wcapi.get(request_url).json() 
     return resp 

は、私は私のdevのマシン上で私のコードをテストする200 OK応答を取得(私はすべてのWooCommerceストアに接続するには、HTTPSを使用しています)。しかし、Google App Engineにコードをデプロイすると、 の一部の WooCommerceストアの401応答が返されます。

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

私はGoogleのApp Engineはすべての発信要求のためのuser-agentヘッダに値(AppEngine-Google; (http://code.google.com/appengine; appid: <application_id>))を追加することを、このドキュメントでhereをお読みください。ローカルマシンからwoocommerce APIを呼び出そうとしたために問題が発生していると思いますが、この値をヘッダーに追加すると、同じエンドポイントで401エラーが発生しました。

>>> headers = {'User-Agent': 'WooCommerce API Client-Python/1.2.1'} 
>>> result = requests.get(url, headers=headers) 
>>> print result.json() 
[{u'date_completed_gmt': None, u'date_modified_gmt': u'2017-11-30T18:13:59', u'payment_method': u'....... 
>>> headers = {'User-Agent': 'WooCommerce API Client-Python/1.2.1; AppEngine-Google; (http://code.google.com/appengine; appid: 123)'} 
>>> result = requests.get(url, headers=headers) 
>>> print result.json() 
{u'message': u'Sorry, you cannot list resources.', u'code': u'woocommerce_rest_cannot_view', u'data': {u'status': 401}} 

これが唯一のWooCommerceサイトではなく、他のカップルのために起こるという事実は、私はこれらのユーザーが、このisssueを引き起こしているWooCommerce設定/プラグイン拡張/セキュリティ設定を持っているかもしれないと思います。何か方法がありますか?

  1. GAEがこのヘッダーに送信要求を追加するのを止めますか?
  2. WooCoomerceストアがuser-agent値に基づいてリクエストをフィルタリングできないようにするプラグインまたは設定をオフにしますか? (セキュリティ設定を自分のサイトに変更するようユーザーに要求することができます)

助けてください。

(私はすでに次のことを試してみましたが、それは助けていない:

  • ではなくPython wrapper for the WooCommerce REST APIrequestsを使用してみましたと私は同じ動作を取得、ローカルのenvに動作しますが、GAE上で401エラーを返し
  • 追加さquery_string_auth=Trueとも示唆されているよう
  • _method=GETクエリパラメータを追加しようとした(念のため、ユーザーは自己署名テストサイトを使用していた)verify_ssl=Falseを追加しようとしたhere
  • さらなる調査の際 here示唆されているように、「アプリケーション/テキスト」に content-typeを設定しようとしました

UPDATE

私はWooCommerceストアサーバがクエリ文字列パラメータを無視することがわかりました。
"query_string_auth = true"設定を送信しないと応答を受け取ることができます。しかし、ストアはすべてのクエリパラメータを無視します。 query_string_authパラメータは、クエリ文字列にconsumer_keyとsecretを送信します。それを削除すると、認証ヘッダーとして使用されます。これで認証ヘッダーとして送信するので、応答します。しかし、クエリパラメータは無視されます。私の推測では、サーバーはすべてのクエリパラメータを無視するということです。それが私が最初に401を手に入れた理由を説明します。 (なぜなら、クエリパラメータとしてキーと秘密を送信したからです)。これは、「User-Agent:AppEngine-Google;」を送信した場合にのみ発生します。

例:

store_url = "https://teststore.com" 
endpoint = "/wp-json/wc/v2/orders?per_page=1" 
auth = ("ck_xxxxxxxxxxx", "cs_xxxxxxxxxxx") 
headers = {'Content-Type': 'application/json', 'User-Agent': 'WooCommerce API Client-Python/1.2.1'} 
url = '{}/{}'.format(store_url, endpoint) 
response = requests.get(url, auth=auth, headers=headers) 
print response.json() 

これは正確に一つの順序を返します。

store_url = "https://teststore.com" 
endpoint = "/wp-json/wc/v2/orders?per_page=1" 
auth = ("ck_xxxxxxxxxxx", "cs_xxxxxxxxxxx") 
headers = {'Content-Type': 'application/json', 'User-Agent': 'WooCommerce API Client-Python/1.2.1; AppEngine-Google; (+http://code.google.com/appengine; appid: 123)'} 
url = '{}/{}'.format(store_url, endpoint) 
response = requests.get(url, auth=auth, headers=headers) 
print response.json() 

これは10件の受注(デフォルトのページサイズは10である)

を返します。しかし、私はまだいくつかの店がこれを行うか、この問題を解決する方法を、なぜ分かりません。

答えて

0

最後に私の問題の解決策が見つかりました。 問題を引き起こしていたWPエンジンの設定でした。私のアプリはGoogle App Engineでホストされ、ヘッダー値「AppEngine-Google; (+ http://code.google.com/appengine; appid: "すべてのリクエストのUser-AgentヘッダーにWPエンジンは、ボットからキャッシュされたバージョンのリクエストをページのリダイレクトし、User-Agentヘッダーを解析してボットを検出します。値は、それがGooglebotであると仮定し、キャッシュされたページにリダイレクトするため、URL内のすべてのクエリパラメータ(認証情報、フィルタパラメータなど)が無視されます。

私は変更する必要がありませんWP-Engineのサポートに連絡して、私のテスト用WooCommerceサイトの1つのユーザエージェントベースのボットフィルタ(デフォルトで有効になっている)を無効にしてもらうように頼んだだけです!

関連する問題