GCP - выдавать себя за служебную учетную запись как пользователь - PullRequest
0 голосов
/ 06 марта 2020

Я хотел бы позволить пользователям олицетворять служебную учетную запись для выполнения операций над длительным процессом. Однако все примеры кода иллюстрируют учетную запись службы, которая олицетворяет другую учетную запись службы.

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

Я слежу за этим примером кода .

Инициализировать исходные учетные данные, у которых нет доступа к корзине списка:

from google.oauth2 import service_acccount

target_scopes = [
    'https://www.googleapis.com/auth/devstorage.read_only']

source_credentials = (
    service_account.Credentials.from_service_account_file(
        '/path/to/svc_account.json',
        scopes=target_scopes))

Теперь используйте исходные учетные данные для получения учетных данных для олицетворения другой учетной записи службы:

from google.auth import impersonated_credentials

target_credentials = impersonated_credentials.Credentials(
  source_credentials=source_credentials,
  target_principal='impersonated-account@_project_.iam.gserviceaccount.com',
  target_scopes = target_scopes,
  lifetime=500)

1 Ответ

2 голосов
/ 06 марта 2020

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

Предоставьте пользователю роль roles/iam.serviceAccountTokenCreator в учетной записи службы.

Вызовите API generateAccessToken, чтобы создать токен доступа из учетной записи службы.

projects.serviceAccounts.generateAccessToken

Простой запрос HTTP POST вернется токен доступа. Измените следующий запрос, указав адрес электронной почты учетной записи службы.

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE-ACCOUNT-NAME@PROJECTID.iam.gserviceaccount.com:generateAccessToken

Тело запроса:

{
  "delegates": [],
  "scope": [
      "https://www.googleapis.com/auth/cloud-platform"
  ],
  "lifetime": "3600s"
}

Для этого API требуется авторизация. Включите маркер доступа OAuth пользователя в заголовок HTTP-авторизации.

Authorization: Bearer ACCESS_TOKEN

Тело ответа:

{
   "accessToken": "eyJ0eXAifeA...NiK8i",
   "expireTime": "2020-03-05T15:01:00.12345678Z"
}
...