Как получить токен GCP Bearer программно с помощью Python - PullRequest
0 голосов
/ 26 ноября 2018

gcloud auth print-access-token дает мне токен на предъявителя, который я могу использовать позже;однако это команда оболочки.Как получить его программно через API Google Cloud Python?

Я вижу предыдущий пример с использованием oauth2client , но oauth2client устарела.Как бы я сделал это с google.auth и oauthlib ?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Хотя приведенный выше ответ довольно информативен, он упускает один важный момент - объект учетных данных, полученный из google.auth.default() или compute_engine.Credentials(), не будет содержать токен.Итак, возвращаясь к первоначальному вопросу о том, что является программной альтернативой gcloud auth print-access-token, мой ответ будет:

import google.auth
import google.auth.transport.requests
creds, projects = google.auth.default()

# creds.valid is False, and creds.token is None
# Need to refresh credentials to populate those

auth_req = google.auth.transport.requests.Request()
creds.refresh(auth_req)

# Now you can use creds.token

Я использую официальный пакет google-auth и учетные данные по умолчанию , что поможет вам работать как в локальном dev, так и в удаленном приложении GCE / GKE.

Жаль, что это не задокументировано должным образом, и мне пришлось прочитать google-auth code , чтобы понять, какполучить токен.

0 голосов
/ 26 ноября 2018

Ответ зависит от вашей среды и способа создания / получения учетных данных.

Что такое учетные данные Google Cloud?

Учетные данные Google Cloud являются OAuth 2.0маркер.Этот токен имеет как минимум Access Token и, необязательно, Refresh Token, Client ID Token и поддерживающие параметры, такие как expiration, Service Account Email или Client Email и т. Д.

Важный элемент вGoogle Cloud APIs является Access Token.Этот токен разрешает доступ к облаку.Этот токен может использоваться в таких программах, как curl, в таких программах, как python и т. Д., И для него не требуется SDK.Access Token используется в заголовке HTTP Authorization.

Что такое токен доступа?

токен доступа - это непрозрачное значение, созданное Google, котороеполученный из подписанного JWT, более правильно называется JWS.JWT состоит из структуры Json заголовка и утверждений (полезной нагрузки).Эти две структуры Json подписаны закрытым ключом учетной записи службы.Эти значения кодируются и объединяются в base64 для создания ключа доступа.

Формат токена доступа: base64(header) + '.' + base64(payload) + '.' + base64(signature).

Вот пример JWT:

Заголовок:

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "42ba1e234ac91ffca687a5b5b3d0ca2d7ce0fc0a"
}

Полезная нагрузка:

{
  "iss": "myservice@myproject.iam.gserviceaccount.com",
  "iat": 1493833746,
  "aud": "myservice.appspot.com",
  "exp": 1493837346,
  "sub": "myservice@myproject.iam.gserviceaccount.com"
}

Использование токена доступа:

Пример, запускающий экземпляр виртуальной машины.Замените PROJECT_ID, ZONE и INSTANCE_NAME.Этот пример для Windows.

curl -v -X GET -H "Authorization: Bearer <access_token_here>" ^
https://www.googleapis.com/compute/v1/projects/%PROJECT_ID%/zones/%ZONE%/instances/%INSTANCE_NAME%/start

Compute Engine Service Account:

Ответ Дастина для этого случая верный, но я приведу для полноты с некоторой дополнительной информацией.

Эти учетные данные автоматически создаются для вас GCP и получаются из метаданных экземпляра виртуальной машины.Разрешения контролируются Cloud API access scopes в консоли Google.

Однако эти учетные данные имеют некоторые ограничения.Чтобы изменить учетные данные, сначала необходимо остановить инстанс виртуальной машины.Кроме того, поддерживаются не все разрешения (роли).

from google.auth import compute_engine

cred = compute_engine.Credentials()

Учетные данные учетной записи службы:

Пока вы не поймете все типы учетных данных и их варианты использования,это учетные данные, которые вы будете использовать для всего, кроме gcloud и gsutil.Понимание этих учетных данных значительно упростит работу с Google Cloud при написании программ.Получить учетные данные из файла Json учетной записи службы Google очень просто.Единственный элемент, на который следует обратить внимание, это то, что срок действия учетных данных истекает (как правило, 60 минут), и их необходимо обновлять или создавать заново.

gcloud auth print-access-token НЕ рекомендуется.Учетные данные учетной записи службы рекомендуются Google.

Эти учетные данные создаются консолью, gcloud или с помощью программ / API.Разрешения назначаются кредиторам IAM и действуют внутри Compute Engine, App Engine, Firestore, Kubernetes и т. Д., А также в других средах вне Google Cloud.Эти учетные данные загружаются из Google Cloud и хранятся в файле Json.Обратите внимание на параметр scopes.Это определяет разрешения, которые предоставляются полученному объекту учетных данных.

SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = 'service-account-credentials.json'

from google.oauth2 import service_account

cred = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)

Учетные данные Google OAuth 2.0:

Эти учетные данные получены из полного потока OAuth 2.0.Эти учетные данные создаются при запуске браузера для доступа к учетным записям Google для авторизации доступа.Этот процесс намного сложнее и требует значительного количества кода для реализации и требует встроенного веб-сервера для обратного вызова для авторизации.

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

Пример кода с использованием google_auth_oauthlib:

from google_auth_oauthlib.flow import InstalledAppFlow

flow = InstalledAppFlow.from_client_secrets_file(
    'client_secrets.json',
    scopes=scope)

cred = flow.run_local_server(
    host='localhost',
    port=8088,
    authorization_prompt_message='Please visit this URL: {url}',
    success_message='The auth flow is complete; you may close this window.',
    open_browser=True)

Пример кода с использованием библиотеки requests_oauthlib:

from requests_oauthlib import OAuth2Session

gcp = OAuth2Session(
        app.config['gcp_client_id'],
        scope=scope,
        redirect_uri=redirect_uri)

# print('Requesting authorization url:', authorization_base_url)

authorization_url, state = gcp.authorization_url(
                        authorization_base_url,
                        access_type="offline",
                        prompt="consent",
                        include_granted_scopes='true')

session['oauth_state'] = state

return redirect(authorization_url)


# Next section of code after the browser approves the request

token = gcp.fetch_token(
            token_url,
            client_secret=app.config['gcp_client_secret'],
            authorization_response=request.url)
...