Включение токена для доступа к непубличной облачной функции Google - PullRequest
2 голосов
/ 07 ноября 2019

Я хочу развернуть облачную функцию Google без публичного доступа. Учетная запись службы должна иметь возможность вызывать функцию с наименьшими разрешениями - для использования внешним сервером.

Я создал учетную запись службы, добавил привязки и загруженные ключи:

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>

Когда я вызываю функцию с ролью invoker, происходит сбой:

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. Это действительно удивляет меня, я думал, что роль призывателя должна быть достаточной. Чего мне здесь не хватает?

Я хотел использовать токен для доступа к функции через 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 Ответ

2 голосов
/ 07 ноября 2019

Google Cloud рекомендует рассматривать такие запросы как запросы конечных пользователей, то есть использовать OAuth2.0, передавая заголовок авторизации (с токеном носителя) при доступе к функциям облака с ролью вызывающего. Подробности: здесь

Попробуйте передать токен на предъявителя, выполнив следующее

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)"
...