Google Cloud Run: вызов из-за пределов GCP - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь получить доступ к безопасному облачному сервису. Если я попробую с моей машины с SDK, он будет работать нормально:

curl --header "Authorization: Bearer $(gcloud auth print-identity-token)"

Однако я не могу заставить его работать, используя API Python, используя ту же учетную запись службы, я Я пытался использовать google-auth для получения токена доступа, но это дает мне ошибку 401 аутентификации. Вот код, который я использую, чтобы попытаться получить токен:

import google.auth
import google.auth.transport.requests

scopes = ['https://www.googleapis.com/auth/cloud-platform']

creds, projects = google.auth.default(scopes=scopes)
auth_req = google.auth.transport.requests.Request()
creds.refresh(auth_req)

# then using creds.token 

Глядя на документы: https://cloud.google.com/run/docs/authenticating/service-to-service#calling_from_outside_gcp здесь сказано следовать примеру кода: https://cloud.google.com/iap/docs/authentication-howto#iap_make_request - python Кажется, я не могу следовать руководству, так как в нем говорится о том, чтобы включить IAP, но кажется, что IAP предназначен только для ядра приложения, а не для работы в облаке?

Кто-нибудь go любой совет по этому поводу?

Спасибо

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

ОК, похоже, для этого есть класс IDTokenCredentials, так как он использует токены Open ID Connect ID вместо токенов доступа OAuth 2.0:

https://google-auth.readthedocs.io/en/latest/reference/google.oauth2.service_account.html

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession

service_url = 'example.com'
key_file = 'key.json'

credentials = service_account.IDTokenCredentials.from_service_account_file(
    key_file, target_audience=service_url)
authed_session = AuthorizedSession(credentials)
response = authed_session.get(service_url)

Это сбивает с толку, поскольку я не вижу этого в документах, и это приводит меня к чему-то другому в отношении IAP, которое, я не думаю, работает с Cloud Run.

0 голосов
/ 20 апреля 2020

Если вы все еще хотите получить свой ID токен и не использовать метод из ответа Дэна, есть обновленный код:

import requests
import google.auth    
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession

service_url = 'example.com'
key_file = 'key.json'

credentials = service_account.IDTokenCredentials.from_service_account_file(
    key_file, target_audience=service_url)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
token = credentials.token
print('ID Token:', token)
...