【问题标题】:Anonymous caller does not have storage.objects.get匿名调用者没有 storage.objects.get
【发布时间】:2019-10-11 15:32:44
【问题描述】:

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

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

我正在使用以下标题;

Authorization: BASIC encoded_base64(username:password)

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

{ “错误”: { “代码”:403, "message": "匿名调用者没有 storage.objects.get 访问 bucket_of_secrets/four_score_seven_years.flac。", “状态”:“PERMISSION_DENIED” } }

所以我有几个问题;

  1. BASIC 授权标头是否可以在 Google HTTP API 中使用?
  2. 我应该使用什么username:password?是我的 GCP 帐户电子邮件和密码吗?即handsome_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" 

这是我的 python 代码中使用 urlfetch 的 sn-p:

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})

【问题讨论】:

  • 另请注意,最佳实践建议您现在更改密码,因为您以一种意想不到的方式将密码发送到服务,因此密码可能已写入该服务的内部日志文件。妥协的可能性可以忽略不计,但在技术上并非为零。

标签: google-app-engine google-cloud-platform http-headers google-cloud-storage urlfetch


【解决方案1】:

对我来说,问题在于使用角色“Storage Legacy Object Reader”,无论出于何种原因,都建议使用该角色。将其更改为“存储对象查看器”解决了该问题。

【讨论】:

    【解决方案2】:

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

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

    但是最好的方法是生成Signed Urls,这样您就可以授予对对象的限制时间访问权限。

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

    【讨论】:

      【解决方案3】:

      1.BASIC Authorization Header 在 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的页面。

      【讨论】:

      • 感谢您的确认和替代解决方案。只是一个简单的问题,因为这是我第一次在 GAE 上工作。在您的 #2 解决方案上。 AppEngineDefaultCredential 适用于 HTTP API 请求还是适用于 ClientLibrary API 调用?
      • @JamesChing 两者都适用。 App Engine 默认服务帐号提供的凭据类型与客户端库使用/生成的凭据类型相同。
      猜你喜欢
      • 1970-01-01
      • 2020-09-23
      • 2020-12-16
      • 1970-01-01
      • 2019-12-11
      • 2022-01-03
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      相关资源
      最近更新 更多