匿名来电者没有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"
}
}
所以我有几个问题;
- BASIC 授权 Header 在 Google HTTP API 中有效吗?
- 我应该使用什么
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 上开发应用程序 运行 的建议。
- 使用 ClientLibrary 调用 Google 个 API。
- 您可以使用
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”解决了这个问题。
在 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" } }
所以我有几个问题;
- BASIC 授权 Header 在 Google HTTP API 中有效吗?
- 我应该使用什么
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 上开发应用程序 运行 的建议。
- 使用 ClientLibrary 调用 Google 个 API。
- 您可以使用
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”解决了这个问题。