Как я могу получить доступ к облачной функции GCP из кода python, используя учетную запись службы? - PullRequest
0 голосов
/ 21 января 2020

Я развернул простую облачную функцию GCP, которая возвращает «Hello World!». Мне нужно, чтобы эта функция была под авторизацией. Я снял флажок «Разрешить неаутентифицированные вызовы», поэтому только аутентифицированные вызовы могут вызывать этот код. Я также создал сервисную учетную запись и назначил следующие роли: - Cloud Functions Invoker - Cloud Functions Service Agent

мой код:

from google.oauth2 import service_account
from google.auth.transport.urllib3 import AuthorizedHttp

if __name__ == '__main__':
    credentials = service_account.Credentials.from_service_account_file('service-account.json',
        scopes=['https://www.googleapis.com/auth/cloud-platform'],
        subject='service-acc@<project_id>.iam.gserviceaccount.com')
    authed_session = AuthorizedHttp(credentials)
    response = authed_session.urlopen('POST', 'https://us-central1-<project_id>.cloudfunctions.net/main')
    print(response.data)

, и я получил ответ:

b'\n<html><head>\n<meta http-equiv="content-type" content="text/html;charset=utf-8">\n<title>401 Unauthorized</title>\n</head>\n<body text=#000000 bgcolor=#ffffff>\n<h1>Error: Unauthorized</h1>\n<h2>Your client does not have permission to the requested URL <code>/main</code>.</h2>\n<h2></h2>\n</body></html>\n'

Как авторизоваться?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Ваш пример кода генерирует токен доступа. Ниже приведен реальный пример, который генерирует токен идентификации и использует этот токен для вызова конечной точки облачных функций. Для функции, которая должна быть использована для авторизации, функция должна иметь роль активатора облачной функции.

0 голосов
/ 23 января 2020

Ошибка из-за того, что вызовы не проходят проверку подлинности.

Поскольку сейчас звонки поступают с вашего локального хоста , это должно работать для вас.

curl https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME \
  -H "Authorization: bearer $(gcloud auth print-identity-token)"

это вызовет вашу учетную запись, активную на gcloud, с вашего localhost.

У учетной записи, выполняющей вызов, должна быть роль Облачные функции Invoker

В будущем просто убедитесь, что служба, вызывающая эту функцию, имеет упомянутую роль.

...