匿名来电者没有storage.objects.get

Anonymous caller does not have storage.objects.get

在 Google App Engine (GAE) 中编写 Python。

我正在尝试向 cloud-speech-to-text api 发出 http post 并使用 URI 音频源(Google 云存储桶 Objects)。

我正在使用以下 headers;

Authorization: BASIC encoded_base64(username:password)

但我仍然不断收到以下错误响应:

{ "error": { "code": 403, "message": "Anonymous caller does not have storage.objects.get access to bucket_of_secrets/four_score_seven_years.flac.", "status": "PERMISSION_DENIED" } }

所以我有几个问题;

  1. BASIC 授权 Header 在 Google HTTP API 中有效吗?
  2. 我应该使用什么username:password?是我的 GCP 帐户电子邮件和密码吗?即 handsome_dude@gmail.com:deluded_fool

其中 handsome_dude@gmail.com 是用户名,deluded_fool 是密码。

我已经尝试将存储桶 objects 设置为 public 可读,当然 http 调用有效...但我宁愿避免设置我的存储桶 objects public 可读。

这是一个示例 Curl 请求:

curl -X POST 

https://speech.googleapis.com/v1/speech:longrunningrecognize?key=<secret_api_key> -d @sample.json -H "Content-Type: application/json, Authorization:  Basic base64encodedusername:password" 

这是我的 python 代码中使用 urlfetch 的片段:

url_post = urlfetch.fetch(url=speech_to_text_url_post, payload=json.dumps(data_to_post), method=urlfetch.POST, headers={"Content-Type" : "application/json", "Authorization" : "Basic "+encoded_user_password})

1.Does BASIC Authorization Header work in Google HTTP API?

不,它不适用于 Google API。 您需要将 OAuth2.0 accessToken 附加到 Authorization Header 作为不记名令牌,例如 Authorization: Bearer ${yourAccessToken}.

我有 2 条关于在 gae 上开发应用程序 运行 的建议。

  1. 使用 ClientLibrary 调用 Google 个 API。
  2. 您可以使用 AppEngineDefaultCredential 调用 Google API。 在发出您的请求之前,请不要忘记为您的 AppEngineDefaultServiceAccount (${projectId}@appspot.gserviceaccount.com) 设置权限。您可以在 cloud console 中的 IAM 页面上配置这些权限。

此外,我建议您阅读有关 How to authenticate your api call 的页面。

如果您想授予public访问权限,您可以制作数据public。

https://cloud.google.com/storage/docs/access-control/making-data-public

但是最好的方法是生成签名的Urls,这样你就可以限制时间访问一个对象。

https://cloud.google.com/storage/docs/access-control/signed-urls

对我来说,问题是使用角色“Storage Legacy Object Reader”,无论出于何种原因,建议使用该角色。将其更改为“Storage Object Viewer”解决了这个问题。