authentication - 启用对非公共(public) Google Cloud Function 的 token 访问

标签 authentication google-cloud-platform oauth-2.0 google-cloud-functions gcloud

我想部署一个没有公共(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!
  1. 这真让我吃惊,我认为调用者角色应该足够了。我在这里缺少什么?

我想使用 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
  1. 这里有什么问题?

感谢您的帮助! 最好的,鲍里斯

最佳答案

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/

相关文章:

angular - 从 Angular 的第一个选项卡注销时,从第二个选项卡注销问题

php - laravel-5.4 - 错误 :Creating default object from empty value

google-cloud-datastore - gCloud:根目录中不存在文件 index.js

java - 如何通过 oauth 2 在 Android 上获取 meetup 访问 token

azure - 使用服务主体授权访问 Azure

authentication - JBoss 是否缓存身份验证信息?

google-compute-engine - GCE-我们无法在端口22上连接到VM

caching - Google Cloud CDN "Force Cache All Content"不缓存所有内容

javascript - 跨域json请求可以设置header吗?

python - 带有 "Remember Me"选项的 Django 登录表单,最好的方法是什么?