我正试图使用以下命令从Python内部调用Google Cloud函数:
import requests
url = "MY_CLOUD_FUNCTON_URL"
data = {'name': 'example'}
response = requests.post(url, data = data)
但我得到了错误:Your client does not have permission to get URL MY_CLOUD_FUNCTON from this server
有人知道我怎样才能避免这个错误吗?我认为我应该以某种方式将凭据作为请求的一部分进行传递?
还要注意的是,如果我试着从下面的命令行通过gcloud调用函数,那么它就可以工作了,但我想在python 中这样做
gcloud functions call MY_CLOUD_FUNCTON --data '{"name": "example"}'
任何帮助都将不胜感激!
在HTTP模式下给定一个工作的云函数,该函数需要身份验证才能触发。
您需要生成一个身份验证令牌并将其插入标头中,如下所示:
import os
import json
import requests
import google.oauth2.id_token
import google.auth.transport.requests
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = './my-service-account.json'
request = google.auth.transport.requests.Request()
audience = 'https://mylocation-myprojectname.cloudfunctions.net/MyFunctionName'
TOKEN = google.oauth2.id_token.fetch_id_token(request, audience)
r = requests.post(
'https://mylocation-myprojectname.cloudfunctions.net/MyFunctionName',
headers={'Authorization': f"Bearer {TOKEN}", "Content-Type": "application/json"},
data=json.dumps({"key": "value"}) # possible request parameters
)
r.status_code, r.reason
这里有几个选项。要么向公众开放该功能,让任何人都可以调用它,要么采取更安全的路线,尽管需要更多的步骤。我将介绍第二个选项,因为出于安全原因,我建议使用它,但如果您对简单地向公众开放函数感到满意(如果您试图创建公共端点,这尤其有用(,请参阅本文档。
然而,如果你想限制谁可以调用你的GCF,你必须再执行几个步骤。
- 创建一个服务帐户并赋予其云函数调用程序角色(如果您只是想限制其仅调用GCF的权限(
- 为服务帐户分配角色后,下一页将提供创建密钥的选项
- 在创建服务帐户密钥并将其下载为
credentials.json
之后,下一步很简单。您只需使用credentials.json
文件的路径填充环境变量GOOGLE_APPLICATION_CREDENTIALS
完成这些步骤后,您可以像以前一样简单地调用GCF,只是这次,它将调用它作为您创建的服务帐户,该帐户包含调用GCF所需的所有权限。
这对许多人来说可能是显而易见的,但要补充Marco的回答(我还不能评论(:
请确保安装google-auth
软件包,而不是google
软件包。有关GitHub上代码的更多详细信息,请参阅文档和requirements.txt。