我在谷歌应用引擎标准环境Python中有一个Flask应用程序,我还有一个带有HTTP触发器的云函数,它接受包括文件URL在内的JSON主体。CF在该URL下载文件,然后将其保存到GCS存储桶中。GAE服务帐户具有云函数调用程序权限,但当在我的GAE代码中使用urlfetch.fetch()
来触发CF时,应用程序引擎代码会出现403 Forbidden
错误,除非我让任何人都可以调用CF触发器。
如何在Python中从GAE成功调用/触发CF?我想答案是其中之一:
- 在GAE服务帐户上设置IAM权限以{在此处启发我}
- 像这样在
urlfetch.fetch()
中添加身份验证头{不同的启示} - 使CF可以从任何地方触发,但硬编码一些密钥,以便CF代码本身处理身份验证
这里有很好的文档:云功能验证简而言之,您必须在身份验证标头中提供您的服务帐户凭据。
要获取凭据,请使用Google Auth客户端库。如果您是从本地进行测试,您应该创建一个服务帐户JSON并将其加载到环境变量GOOGLE_APPLICATION_CREDENTIALS
中,但在应用程序引擎上,它将从头开始工作。
获得令牌后,将其作为auth头进行传递,如下所示:
auth_req = google.auth.transport.requests.Request()
auth_token = google.oauth2.id_token.fetch_id_token(auth_req, cloud_function_url)
response = requests.post(cloud_function_url, json=payload, headers={"Authorization" : f"Bearer {auth_token}"})