私は、ユーザーが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設定/プラグイン拡張/セキュリティ設定を持っているかもしれないと思います。何か方法がありますか?
- GAEがこのヘッダーに送信要求を追加するのを止めますか?
- WooCoomerceストアが
user-agent
値に基づいてリクエストをフィルタリングできないようにするプラグインまたは設定をオフにしますか? (セキュリティ設定を自分のサイトに変更するようユーザーに要求することができます)
助けてください。
(私はすでに次のことを試してみましたが、それは助けていない:
- ではなくPython wrapper for the WooCommerce REST APIのrequestsを使用してみましたと私は同じ動作を取得、ローカルの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である)
を返します。しかし、私はまだいくつかの店がこれを行うか、この問題を解決する方法を、なぜ分かりません。