2

사용자가 WooCommerce 상점을 내 사이트와 통합 할 수있는 앱을 작성 중입니다. Python wrapper for the WooCommerce REST API을 사용 중이며 내 앱이 Google App Engine에서 호스팅됩니다. Woocommerce API를 호출하는 코드는 다음과 같습니다. WooCommerce API는 Google App Engine에서 401을 제공하지만 현지 환경에서 작동합니다 (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}} 

내가 구글 앱 엔진은 모든 아웃 바운드 요청에 대해 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
  • 는 설정을 시도 content-type 나는 WooCommerce 저장소 서버가 쿼리 문자열 매개 변수를 무시 발견 추가 조사시 제안 here로 "응용 프로그램/텍스트")

UPDATE

합니다.
"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 엔진이 봇의 요청을 페이지의 캐시 된 버전으로 리디렉션합니다. 사용자 에이전트 헤더를 구문 분석하여 봇을 탐지합니다. 값은 GoogleBot이라고 가정하고 캐시 된 페이지로 리디렉션하므로 URL의 모든 쿼리 매개 변수 (자격 증명, 필터 매개 변수 등)가 무시됩니다.

변경하지 않아도됩니다. WP-Engine 지원팀에 연락하여 테스트 용 WooCommerce 사이트 중 하나에 대한 사용자 에이전트 기반 봇 필터 (기본적으로 켜져 있음)를 끄도록 요청한 것입니다.