我想部署一个没有公共(public)访问权限的 Google Cloud Functions。服务帐户应该能够以最低权限调用函数 - 以供外部服务器使用。
我已经创建了一个服务帐户,添加了绑定(bind)并下载了 key :
gcloud iam service-accounts create <NAME> --project <PROJECT> --description <DESCRIPTION>
gcloud beta functions add-iam-policy-binding <FUNCTION> --region europe-west1 --member serviceAccount:<EMAIL> --role roles/cloudfunctions.invoker
gcloud iam service-accounts keys create --iam-account <EMAIL> <KEYFILE>
当我使用调用者角色调用函数时,失败了:
gcloud auth activate-service-account <EMAIL> --key-file <KEYFILE>
gcloud beta functions call <FUNCTION> --region=europe-west1 --data '{}'
ERROR: (gcloud.beta.functions.call) ResponseError: status=[403], code=[Forbidden], message=[The caller does not have permission]
但是,当我切换到我的用户时,添加 roles/cloudfunctions.developer
角色,切换回服务帐户,上面的工作:
gcloud config set account <USER>
gcloud beta functions add-iam-policy-binding <FUNCTION> --region europe-west1 --member serviceAccount:<EMAIL> --role roles/cloudfunctions.developer
gcloud auth activate-service-account <EMAIL> --key-file <KEYFILE>
gcloud beta functions call <FUNCTION> --region=europe-west1 --data '{}'
Success!
- 这真让我吃惊,我认为调用者角色应该足够了。我在这里缺少什么?
我想使用 token 通过 curl 访问该函数,但这根本不起作用,无论是作为调用者还是开发者:
echo $(GOOGLE_APPLICATION_CREDENTIALS=<KEYFILE> gcloud auth application-default print-access-token) > <TOKENFILE>
curl -H "Authorization: Bearer $(cat <TOKENFILE>" <FUNCTIONURL>
→ 401 Unauthorized as HTML page
- 这里有什么问题?
感谢您的帮助! 最好的,鲍里斯
最佳答案
Google Cloud 建议将此类请求视为最终用户请求,即在使用调用者角色访问 Cloud 函数时通过传递授权 header (带有不记名 token )来使用 OAuth2.0。详情是here
尝试通过执行以下操作来传递不记名 token
gcloud auth activate-service-account <service account> <key file>
gcloud auth print-identity-token <service account>
curl https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME \
-H "Authorization: bearer $(gcloud auth print-identity-token)"
关于authentication - 启用对非公共(public) Google Cloud Function 的 token 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58741674/