匿名调用者没有 storage.objects.get

Jam*_*ing 16 google-app-engine http-headers urlfetch google-cloud-storage google-cloud-platform

在用 Python 编写的 Google App Engine (GAE) 上。

我正在尝试向 cloud-speech-to-text api 发布 http 帖子并使用 URI 音频源(Google Cloud Storage Bucket Objects)。

我正在使用以下标题;

Authorization: BASIC encoded_base64(username:password)
Run Code Online (Sandbox Code Playgroud)

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

{ "error": { "code": 403, "message": "匿名来电者没有 storage.objects.get 访问 bucket_of_secrets/four_score_seven_years.flac.", "status": "PERMISSION_DENIED" } }

所以我有几个问题;

  1. BASIC Authorization Header 在 Google HTTP API 中工作吗?
  2. username:password应该使用什么?是我的 GCP 帐户电子邮件和密码吗?IEhandsome_dude@gmail.com:deluded_fool

哪里handsome_dude@gmail.com是用户名,哪里是deluded_fool密码。

我已经尝试将存储桶对象设置为公共可读,当然 http 调用有效……但我宁愿避免将存储桶对象设置为公共可读。

这是一个示例 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" 
Run Code Online (Sandbox Code Playgroud)

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

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})
Run Code Online (Sandbox Code Playgroud)

小智 12

1.BASIC Authorization Header 在 Google HTTP API 中工作吗?

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

我有 2 个建议来开发一些在 gae 上运行的应用程序。

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

此外,我建议您阅读有关如何验证您的 api 调用的页面

  • @JamesChing 适用于两者。App Engine 默认服务帐户提供与客户端库使用/生成的凭据类型相同的凭据。 (2认同)

小智 7

如果您想授予公共访问权限,您可以公开数据。

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

最好的方法是生成签名 URL,这样您就可以授予对对象的限时访问权限。

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