2

我的GAE應用正試圖操縱存儲在Google雲端存儲上的文件。來自GAE的雲存儲API請求 - 403未配置訪問

這些文件存儲在我的應用的默認存儲桶中。我已經設法使用GCS Python Client Library(https://developers.google.com/appengine/docs/python/googlecloudstorageclient/)讀取/寫入文件到該存儲桶。

不幸的是,它不支持複製。相反,我嘗試使用API​​客戶端庫(https://google-api-client-libraries.appspot.com/documentation/storage/v1/python/latest/storage_v1.objects.html)和服務帳戶(https://developers.google.com/api-client-library/python/guide/google_app_engine#ServiceAccounts

JSON API到目前爲止,我在請求雲存儲URL時收到錯誤403。

下面的代碼:

credentials = AppAssertionCredentials(scope='https://www.googleapis.com/auth/devstorage.read_write') 
http = credentials.authorize(httplib2.Http(memcache)) 
service = discovery.build('storage', 'v1', http=http, developerKey='api_key_generated_from_the_dev_console') 
bucket_name = app_identity.get_default_gcs_bucket_name() 

# I'm planning to batch multiple requests, although there is just one in this example 
batch = BatchHttpRequest() 

# process_list_response outputs the exception if any 
batch.add(service.objects().list(bucket=bucket_name), callback=process_list_response) 
batch.execute(http=http) 

這裏的日誌:被請求

網址:被請求 https://www.googleapis.com/discovery/v1/apis/storage/v1/rest?userIp=x.x.x.x

試圖刷新獲得初始的access_token

網址: https://www.googleapis.com/storage/v1/b/xxx.appspot.com/o?alt=json

HttpError 403請求時 https://www.googleapis.com/storage/v1/b/xxx-dev.appspot.com/o?alt=json 返回「訪問未配置。請使用Google Developers Console 爲您的項目激活API。

下面是我在開發者控制檯中所做的:

  • 谷歌雲存儲和谷歌雲存儲JSON API切換 爲ON
  • 我創建了一個API密鑰我。用於構建服務(是否有必要,因爲我也使用Oauth?)
  • 在權限下,我添加了我的應用程序的成員與電子郵件[email protected]

我該如何做這項工作?

回答

1

將此作爲答案發布,因爲看起來我的編輯(我們一起工作)被默默拒絕,評論太有限。這不是一個答案,但這正在擴大這個問題。

簡單的例子,一個http請求。看起來JSON API根本不在API Explorer之外工作。 XML/REST API工作並返回存儲桶中的文件列表。

credentials = AppAssertionCredentials(scope='https://www.googleapis.com/auth/devstorage.read_write') 
http = credentials.authorize(httplib2.Http(memcache)) 

bucket_name = app_identity.get_default_gcs_bucket_name() 

# This works (200 with list of files in the content) 
request_url = 'http://commondatastorage.googleapis.com/' + bucket_name 
response, content = http.request(request_url, method="GET") 

# This doesn't work (403, Access not configured) 
request_url = 'https://www.googleapis.com/storage/v1/b/' + bucket_name + '/o?alt=json' 
response, content = http.request(request_url, method="GET") 

# This doesn't work (403, Access not configured), the key and project id header seem useless. 
request_url = 'https://www.googleapis.com/storage/v1/b/' + bucket_name + '/o?alt=json&key=' + API_KEY 
response, content = http.request(request_url, method="GET", headers={'x-goog-project-id': PROJECT_ID}) 

而且,看着AppAssertionCredentials的代碼,我們可以看到:

kwargs: optional keyword args, including: 
    service_account_id: service account id of the application. If None or 
     unspecified, the default service account for the app is used. 

self.service_account_id = kwargs.get('service_account_id', None) 

一個異常傳遞什麼作爲service_account_id論證結果:

Traceback (most recent call last): 
    File "/base/data/home/apps/.../1.37.../backup.py", line 61, in get 
    response, content = http.request(request_url, method="GET") 
    File "/base/data/home/apps/.../1.377.../oauth2client/util.py", line 132, in positional_wrapper 
    return wrapped(*args, **kwargs) 
    File "/base/data/home/apps/.../1.37.../oauth2client/client.py", line 491, in new_request 
    self._refresh(request_orig) 
    File "/base/data/home/apps/.../1.37.../oauth2client/appengine.py", line 197, in _refresh 
    raise AccessTokenRefreshError(str(e)) 
AccessTokenRefreshError 

我已經測試通過的由app_identity.get_service_account_name()返回的值,不起作用。 (儘管文檔說它將使用「應用程序的默認服務帳戶」(如果未設置)。

我已測試過在開發者控制檯中發現的服務帳戶電子郵件,其格式爲:[email protected]。同樣的令牌異常。

那麼,爲什麼我們會在我們的api/services下明確啓用Cloudstorage JSON API時未獲得配置的403 Access?

爲什麼傳遞一個service_account_id到AppAssertionCredentials失敗與AccessTokenRefreshError?

編輯:

的解決辦法是荒謬的:關閉谷歌雲存儲API,並重新開啓。

我假定應用程序是一個「傳統」的應用程序,而這樣做的最後一次子彈點12在這裏工作:https://developers.google.com/appengine/docs/python/googlecloudstorageclient/activate

相關問題