Это руководство поможет вам выбрать и настроить подходящий способ аутентификации для рабочего развертывания Data Manager API.
Выберите сценарий развертывания
Выберите способ аутентификации, который соответствует архитектуре приложения и среде развертывания:
- Рабочие нагрузки в Google Cloud. Для автоматизированных рабочих нагрузок (например, конвейеров ETL, пакетных заданий или серверных сервисов), выполняемых в Compute Engine, Cloud Run, Cloud Functions или GKE, используйте Application Default Credentials (ADC) с прикрепленным сервисным аккаунтом или Workload Identity Federation для GKE.
- Рабочие нагрузки за пределами Google Cloud. Для автоматизированных рабочих нагрузок, выполняемых локально или у других поставщиков облачных услуг, используйте Application Default Credentials (ADC) с Workload Identity Federation или ключом сервисного аккаунта.
- Действия от имени пользователей. Для сторонних платформ и многопользовательских приложений, которые управляют аккаунтами внешних пользователей (например, рекламодателей, зарегистрированных на вашей платформе), используйте поток веб-сервера OAuth 2.0 с токенами обновления для каждого пользователя или связи с партнерами, если вы являетесь одобренным партнером по обработке данных.
Общие рекомендации по аутентификации в Google Cloud можно найти в дереве решений по аутентификации в Google Cloud.
Рабочие нагрузки в Google Cloud
При работе в Google Cloud прикрепите сервисный аккаунт непосредственно к вычислительному ресурсу или настройте Workload Identity Federation для GKE. Клиентские библиотеки используют ADC для автоматического получения учетных данных с коротким сроком действия для сервисного аккаунта без необходимости использовать файлы учетных данных или переменные среды.
Compute Engine
При создании экземпляра виртуальной машины укажите сервисный аккаунт и область действия Data Manager API, чтобы токены доступа, возвращаемые сервером метаданных экземпляра, включали необходимые разрешения.
gcloud compute instances create INSTANCE_NAME \
--service-account="SERVICE_ACCOUNT_EMAIL" \
--scopes="https://www.googleapis.com/auth/datamanager,https://www.googleapis.com/auth/cloud-platform"
Чтобы обновить области действия или сервисный аккаунт в существующем экземпляре, остановите его, обновите конфигурацию с помощью set-service-account и перезапустите экземпляр:
gcloud compute instances stop INSTANCE_NAME
gcloud compute instances set-service-account \
INSTANCE_NAME \
--service-account="SERVICE_ACCOUNT_EMAIL" \
--scopes="https://www.googleapis.com/auth/datamanager,https://www.googleapis.com/auth/cloud-platform"
gcloud compute instances start INSTANCE_NAME
Cloud Run
Укажите сервисный аккаунт при развертывании сервиса:
gcloud run deploy SERVICE_NAME \
--image="IMAGE_URL" \
--service-account="SERVICE_ACCOUNT_EMAIL"
Cloud Functions
Укажите сервисный аккаунт при развертывании функции:
gcloud functions deploy FUNCTION_NAME \
--service-account="SERVICE_ACCOUNT_EMAIL" \
--runtime="RUNTIME" \
--trigger-http
GKE
- Включите Workload Identity Federation для GKE в кластере.
Привяжите сервисный аккаунт Kubernetes (KSA) к сервисному аккаунту Google (GSA):
# Define the Kubernetes service account member: KUBERNETES_MEMBER="serviceAccount:PROJECT_ID.svc.id.goog[KUBERNETES_NAMESPACE/KUBERNETES_SA_NAME]" # Grant the Workload Identity User role to the Kubernetes service account: gcloud iam service-accounts add-iam-policy-binding \ SERVICE_ACCOUNT_EMAIL \ --role="roles/iam.workloadIdentityUser" \ --member="${KUBERNETES_MEMBER}"Добавьте аннотацию к сервисному аккаунту Kubernetes с адресом электронной почты сервисного аккаунта Google:
kubectl annotate serviceaccount KUBERNETES_SA_NAME \ --namespace="KUBERNETES_NAMESPACE" \ iam.gke.io/gcp-service-account="SERVICE_ACCOUNT_EMAIL"Укажите сервисный аккаунт Kubernetes в спецификации пода:
apiVersion: v1 kind: Pod metadata: name: data-manager-worker spec: serviceAccountName: KUBERNETES_SA_NAME containers: - name: worker image: IMAGE_URL
Проверьте доступ к аккаунту и IAM
Прежде чем развертывать рабочее приложение, убедитесь, что у сервисного аккаунта есть необходимые разрешения:
Разрешения Google Cloud IAM. Предоставьте сервисному аккаунту роль Потребитель сервисов (
roles/serviceusage.serviceUsageConsumer) в проекте Google Cloud, в котором включен Data Manager API.gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_EMAIL" \ --role="roles/serviceusage.serviceUsageConsumer"Доступ к целевому аккаунту. Предоставьте сервисному аккаунту необходимый доступ к целевым аккаунтам. Подробнее о том, как настроить доступ к аккаунту…
Рабочие нагрузки за пределами Google Cloud
При выполнении кода в локальных центрах обработки данных или в облачных сервисах сторонних поставщиков выберите один из следующих механизмов аутентификации:
Workload Identity Federation (рекомендуется): Настройте Workload Identity Federation, чтобы ваше приложение могло обменивать учетные данные от внешнего поставщика идентификационной информации на краткосрочные учетные данные Google Cloud без управления ключами сервисных аккаунтов. Создайте файл конфигурации учетных данных и предоставьте его ADC с помощью переменной среды
GOOGLE_APPLICATION_CREDENTIALS.Ключи сервисных аккаунтов (резервный вариант). Если федерация идентификации рабочей нагрузки недоступна, создайте ключ сервисного аккаунта и предоставьте его ADC с помощью переменной среды
GOOGLE_APPLICATION_CREDENTIALS.
Установить GOOGLE_APPLICATION_CREDENTIALS
Задайте для переменной среды GOOGLE_APPLICATION_CREDENTIALS абсолютный путь к файлу конфигурации учетных данных для интеграции идентификационных данных рабочих нагрузок или файлу ключа сервисного аккаунта, чтобы клиентские библиотеки могли автоматически находить ваши учетные данные с помощью ADC.
Linux и macOS
Задайте переменную среды в профиле оболочки или скрипте развертывания:
export GOOGLE_APPLICATION_CREDENTIALS=\
"/path/to/credentials.json"
Windows (PowerShell)
Задайте переменную среды в PowerShell:
$env:GOOGLE_APPLICATION_CREDENTIALS = `
"C:\path\to\credentials.json"
Docker / контейнеры
Смонтируйте файл учетных данных в контейнер и задайте переменную среды:
ENV GOOGLE_APPLICATION_CREDENTIALS="/secrets/credentials.json"
Или передайте переменную среды во время выполнения:
HOST_CREDS="/host/path/credentials.json"
docker run -e GOOGLE_APPLICATION_CREDENTIALS="/secrets/credentials.json" \
-v "${HOST_CREDS}:/secrets/credentials.json:ro" \
IMAGE_NAME
Kubernetes
Смонтируйте учетные данные как секрет и укажите его в среде пода:
apiVersion: v1
kind: Pod
metadata:
name: data-manager-worker
spec:
containers:
- name: worker
image: IMAGE_URL
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: "/etc/secrets/google/credentials.json"
volumeMounts:
- name: credentials-volume
mountPath: "/etc/secrets/google"
readOnly: true
volumes:
- name: credentials-volume
secret:
secretName: data-manager-credentials
Как аутентифицировать запросы REST и curl
Если ваш автоматизированный конвейер отправляет необработанные HTTP-запросы с curl, а не использует клиентскую библиотеку, воспользуйтесь интерфейсом командной строки Google Cloud, чтобы неинтерактивно аутентифицироваться и управлять токенами доступа без подписи токенов вручную:
Авторизуйте интерфейс командной строки Google Cloud, используя файл учетных данных, настроенный в вашей среде:
gcloud auth login --cred-file="${GOOGLE_APPLICATION_CREDENTIALS}"Передайте сгенерированный токен доступа в заголовке
Authorizationваших запросов к API:curl -X POST "https://datamanager.googleapis.com/v1/..." \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -d @request.jsonGoogle Cloud CLI автоматически кеширует токен доступа и обновляет его до истечения срока действия.
Проверьте доступ к аккаунту и IAM
Прежде чем развертывать рабочее приложение, убедитесь, что у сервисного аккаунта есть необходимые разрешения:
Разрешения Google Cloud IAM. Предоставьте сервисному аккаунту роль Потребитель сервисов (
roles/serviceusage.serviceUsageConsumer) в проекте Google Cloud, в котором включен Data Manager API.gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_EMAIL" \ --role="roles/serviceusage.serviceUsageConsumer"Доступ к целевому аккаунту. Предоставьте сервисному аккаунту необходимый доступ к целевым аккаунтам. Подробнее о том, как настроить доступ к аккаунту…
Действия от имени пользователей
Сторонним платформам, например маркетинговым платформам и агентствам, часто требуется отправлять запросы API от имени нескольких рекламодателей, которые зарегистрировались в их сервисе.
В этой архитектуре вместо Application Default Credentials используйте поток веб-сервера OAuth 2.0, чтобы получать учетные данные пользователя с офлайн-доступом от каждого рекламодателя, а затем использовать эти учетные данные для настройки клиентской библиотеки во время выполнения в зависимости от того, каким рекламным аккаунтом управляет запрос.
Как реализовать веб-процесс OAuth 2.0
Чтобы настроить делегирование пользователей для многоклиентских приложений, выполните следующие действия:
Запросите офлайн-доступ. Перенаправьте пользователей на окно запроса доступа OAuth от Google, запросив область действия
https://www.googleapis.com/auth/datamanagerсaccess_type=offlineиprompt=consent. Ваш сервер обменивает код авторизации на токен доступа иrefresh_token. Пошаговые инструкции приведены в статье Использование OAuth 2.0 для веб-серверных приложений.Надежно храните учетные данные. Храните токены обновления каждого пользователя в зашифрованном хранилище учетных данных, связанном с его аккаунтом на вашей платформе.
Инициализируйте клиентские библиотеки во время выполнения. При отправке запроса к API от имени определенного пользователя создайте учетные данные пользователя на основе сохраненного для него токена обновления, а также идентификатора клиента и секретного кода клиента для вашего приложения и передайте их при инициализации клиента:
.NET
using Google.Ads.DataManager.V1; using Google.Apis.Auth.OAuth2; UserCredential credential = CredentialFactory.FromJsonParameters<UserCredential>( new JsonCredentialParameters { Type = JsonCredentialParameters.AuthorizedUserCredentialType, ClientId = clientId, ClientSecret = clientSecret, RefreshToken = refreshToken }); IngestionServiceClient client = new IngestionServiceClientBuilder { Credential = credential }.Build();Проложить маршрут
import ( "context" datamanager "cloud.google.com/go/datamanager/apiv1" "golang.org/x/oauth2" "golang.org/x/oauth2/google" "google.golang.org/api/option" ) cfg := &oauth2.Config{ ClientID: clientID, ClientSecret: clientSecret, Endpoint: google.Endpoint, } ts := cfg.TokenSource(ctx, &oauth2.Token{RefreshToken: refreshToken}) client, err := datamanager.NewIngestionClient(ctx, option.WithTokenSource(ts))Java
import com.google.ads.datamanager.v1.IngestionServiceClient; import com.google.ads.datamanager.v1.IngestionServiceSettings; import com.google.api.gax.core.FixedCredentialsProvider; import com.google.auth.oauth2.UserCredentials; UserCredentials credentials = UserCredentials.newBuilder() .setClientId(clientId) .setClientSecret(clientSecret) .setRefreshToken(refreshToken) .build(); IngestionServiceSettings settings = IngestionServiceSettings.newBuilder() .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) .build(); try (IngestionServiceClient client = IngestionServiceClient.create(settings)) { // Send API requests using client... }Node.js
const {IngestionServiceClient} = require('@google-ads/datamanager').v1; const {UserRefreshClient} = require('google-auth-library'); const authClient = new UserRefreshClient({ clientId, clientSecret, refreshToken, }); const client = new IngestionServiceClient({authClient});PHP
use Google\Ads\DataManager\V1\Client\IngestionServiceClient; use Google\Auth\Credentials\UserRefreshCredentials; $credentials = new UserRefreshCredentials( null, [ 'client_id' => $clientId, 'client_secret' => $clientSecret, 'refresh_token' => $refreshToken, ] ); $client = new IngestionServiceClient(['credentials' => $credentials]);Python
from google.ads.datamanager_v1 import IngestionServiceClient from google.oauth2.credentials import Credentials credentials = Credentials.from_authorized_user_info({ "client_id": client_id, "client_secret": client_secret, "refresh_token": refresh_token, }) client = IngestionServiceClient(credentials=credentials)Ruby
require "google/ads/data_manager/v1" require "googleauth" credentials = Google::Auth::UserRefreshCredentials.new( client_id: client_id, client_secret: client_secret, refresh_token: refresh_token ) client = Google::Ads::DataManager::V1::IngestionService::Client.new do |config| config.credentials = credentials end
Как пройти проверку приложения OAuth
Поскольку область действия https://www.googleapis.com/auth/datamanager является конфиденциальной, любое приложение Google Cloud, используемое для получения учетных данных пользователя из внешних аккаунтов Google, должно пройти проверку OAuth в Google перед запуском в производство:
- Разработка. Если статус публикации приложения в Google Cloud Console на странице аудитории установлен как Тестирование, авторизовать приложение могут только назначенные тестовые аккаунты.
- Рабочая версия. Прежде чем сделать приложение доступным для внешних пользователей, установите статус публикации В рабочей версии и отправьте приложение на проверку.
Для рабочих нагрузок, выполняемых с помощью сервисных аккаунтов, подтверждение приложений не требуется. Кроме того, есть исключения для некоторых сценариев, например для внутренних приложений. Подробнее о том, в каких случаях подтверждение не требуется…
Альтернативный вариант: ссылки партнеров
Если ваша организация является одобренным партнером по обработке данных, вы можете использовать партнерские ссылки вместо управления токенами OAuth для каждого пользователя при постоянном добавлении данных.
С помощью партнерских связей рекламодатели подключают свои аккаунты к аккаунту партнера по обработке данных в интерфейсе Google Рекламы, Дисплея и Видео 360 или Google Менеджера рекламы. После установления связи ваше приложение отправляет запросы на загрузку, используя учетные данные собственного сервисного аккаунта через ADC. Это позволяет избежать необходимости хранить и поддерживать долгоживущие токены обновления пользователей.
Рекомендации по производству
При переходе к рабочей версии учитывайте следующие ключевые факторы:
- Обработка ошибок и проверка. Узнайте, как API проверяет запросы с помощью модели быстрого отказа и возвращает структурированные сведения об ошибках.
- Стратегия повторных запросов. Реализуйте экспоненциальную выдержку с добавлением случайного значения для временных ошибок сервера.
- Пакетная обработка и параллелизм. Увеличьте производительность, объединив записи в пакеты и отправив запросы одновременно в пределах ограничений.
- Диагностика и мониторинг. Получайте идентификаторы запросов ответов и запрашивайте диагностический сервис, чтобы проверить асинхронную обработку и обнаружить предупреждения и ошибки.