匿名呼叫者没有storage.objects.get

时间:2019-05-25 07:17:52

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

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

我正尝试向云语音文本api发出http帖子,并使用URI音频源(Google云存储桶对象)。

我正在使用以下标题;

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" 

这是我使用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})

2 个答案:

答案 0 :(得分:2)

  

1.BASIC授权标头可以在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的页面。

答案 1 :(得分:0)

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

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

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

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