Сервисный аккаунт – это тип аккаунта Google, который может использоваться приложением для программного доступа к API Google с помощью OAuth 2.0. Они не требуют персональной авторизации. Вместо этого используется файл ключа, доступ к которому есть только у вашего приложения.
Прежде чем изучать информацию о сервисных аккаунтах, ознакомьтесь с более простым и рекомендуемым процессом установки приложения OAuth 2.0. Хотя этот процесс требует ручного взаимодействия с пользователем для авторизации вашего приложения, этот шаг необходимо выполнить только один раз и не нужно выполнять в вашей рабочей среде. Токены обновления, созданные в рамках этого процесса, не имеют срока действия, могут кешироваться и развертываться в разных средах, а также использоваться для создания токенов доступа по запросу без участия пользователя.
Вы ещё читаете? Вы можете использовать сервисный аккаунт одним из следующих способов:
- Создайте пользователя Дисплея и Видео 360, связанного с вашим сервисным аккаунтом. В этом случае сервисный аккаунт будет работать как обычный аккаунт пользователя и позволит вам получить доступ ко всем партнерам и рекламодателям, которые были предоставлены пользователю. Это предпочтительный способ использования сервисных аккаунтов в Дисплее и Видео 360.
- Используйте делегирование на уровне домена, чтобы отправлять запросы от имени одного или нескольких пользователей Дисплея и Видео 360, связанных с аккаунтами в домене G Suite. В этом случае у вас должен быть доступ с правами администратора к целевому домену. Дополнительную информацию о настройке G Suite и домена можно найти на странице поддержки G Suite.
Требования
Чтобы использовать сервисный аккаунт, связанный с пользователем Дисплея и Видео 360, выберите вкладку Пользователь DV360. Чтобы использовать делегирование доступа к данным в домене, выберите вкладку Делегирование.
Пользователь DV360
С вашим сервисным аккаунтом должен быть связан пользователь Дисплея и Видео 360.
Делегирование
- У вас должен быть доступ с правами администратора к домену, зарегистрированному в G Suite.
- У вас должен быть один или несколько пользователей Дисплея и Видео 360, связанных с аккаунтами в домене, зарегистрированном в G Suite. Пользователей, связанных с аккаунтами в других доменах (например, gmail.com), использовать нельзя.
Как настроить и использовать сервисный аккаунт
Пользователь DV360
Создайте ключ сервисного аккаунта в Google API Console.
Свяжите пользователя Дисплея и Видео 360 с адресом электронной почты сервисного аккаунта, полученным на предыдущем шаге, как описано в статье Справочного центра Как управлять пользователями в Дисплее и Видео 360.
Реализуйте в своем приложении межсерверный процесс OAuth 2.0, используя только что созданный сервисный аккаунт. Дополнительную информацию вы найдете в разделе Примеры.
Делегирование
Создайте ключ сервисного аккаунта в Google API Console.
Делегируйте этому сервисному аккаунту права доступа к данным в домене, чтобы он мог действовать от имени пользователей в вашем домене. При появлении запроса укажите следующие области действия API:
Область действия Значение https://www.googleapis.com/auth/display-videoДоступ для чтения и записи. https://www.googleapis.com/auth/display-video-user-managementДоступ для чтения и записи для сервиса users. Доступно только для пользователей сервисных аккаунтов.Реализуйте в своем приложении межсерверный процесс OAuth 2.0, используя только что созданный сервисный аккаунт. Дополнительную информацию вы найдете в разделе Примеры. Помните, что вам нужно будет указать аккаунт, от имени которого будут выполняться действия. Он должен принадлежать домену, для которого сервисному аккаунту были делегированы права на уровне домена на предыдущем шаге.
Если вам нужна помощь с настройкой G Suite и/или домена, посетите страницу поддержки G Suite.
Примеры
Java
import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.services.displayvideo.v4.DisplayVideo; import com.google.api.services.displayvideo.v4.DisplayVideoScopes; import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import java.io.FileInputStream; /** * This example demonstrates how to authenticate using a service account. */ public class AuthenticateUsingServiceAccount { // Path to a JSON file containing service account credentials for this application. This file can // be downloaded from the Credentials tab on the Google API Console. private static final String PATH_TO_JSON_FILE = "ENTER_PATH_TO_CLIENT_SECRETS_HERE"; /** * An optional Google account email to impersonate. Only applicable to service accounts which have * enabled domain-wide delegation and wish to make API requests on behalf of an account within * their domain. Setting this field will not allow you to impersonate a user from a domain you * don't own (e.g., gmail.com). */ private static final String EMAIL_TO_IMPERSONATE = ""; // The OAuth 2.0 scopes to request. private static final ImmutableSetOAUTH_SCOPES = ImmutableSet.copyOf(DisplayVideoScopes.all()); private static Credential getServiceAccountCredential( String pathToJsonFile, String emailToImpersonate) throws Exception { // Generate a credential object from the specified JSON file. GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream(pathToJsonFile)); // Update the credential object with appropriate scopes and impersonation info (if applicable). if (Strings.isNullOrEmpty(emailToImpersonate)) { credential = credential.createScoped(OAUTH_SCOPES); } else { credential = new GoogleCredential.Builder() .setTransport(credential.getTransport()) .setJsonFactory(credential.getJsonFactory()) .setServiceAccountId(credential.getServiceAccountId()) .setServiceAccountPrivateKey(credential.getServiceAccountPrivateKey()) .setServiceAccountScopes(OAUTH_SCOPES) // Set the email of the user you are impersonating (this can be yourself). .setServiceAccountUser(emailToImpersonate) .build(); } return credential; } public static void main(String[] args) throws Exception { // Build service account credential. Credential credential = getServiceAccountCredential(PATH_TO_JSON_FILE, EMAIL_TO_IMPERSONATE); // Create a DisplayVideo service instance. // // Note: application name below should be replaced with a value that identifies your // application. Suggested format is "MyCompany-ProductName/Version.MinorVersion". DisplayVideo service = new DisplayVideo.Builder(credential.getTransport(), credential.getJsonFactory(), credential) .setApplicationName("displayvideo-java-service-acct-sample") .build(); // Make API requests. } }
Python
"""This example demonstrates how to authenticate using a service account. An optional Google account email to impersonate may be specified as follows: authenticate_using_service_account.py <path_to_json_file> -i <email> This optional flag only applies to service accounts which have domain-wide delegation enabled and wish to make API requests on behalf of an account within that domain. Using this flag will not allow you to impersonate a user from a domain you don't own (e.g., gmail.com). """ import argparse import sys from googleapiclient import discovery import httplib2 from oauth2client import client from oauth2client import tools from oauth2client.service_account import ServiceAccountCredentials # Declare command-line flags. argparser = argparse.ArgumentParser(add_help=False) argparser.add_argument( 'path_to_service_account_json_file', help='Path to the service account JSON file to use for authenticating.') argparser.add_argument( '-i', '--impersonation_email', help='Google account email to impersonate.') API_NAME = 'displayvideo' API_VERSION = 'v4' API_SCOPES = ['https://www.googleapis.com/auth/display-video'] def main(argv): # Retrieve command line arguments. parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, parents=[tools.argparser, argparser]) flags = parser.parse_args(argv[1:]) # Authenticate using the supplied service account credentials http = authenticate_using_service_account( flags.path_to_service_account_json_file, flags.impersonation_email) # Build a service object for interacting with the API. service = discovery.build(API_NAME, API_VERSION, http=http) # Make API requests. def authenticate_using_service_account(path_to_service_account_json_file, impersonation_email): """Authorizes an httplib2.Http instance using service account credentials.""" # Load the service account credentials from the specified JSON keyfile. credentials = ServiceAccountCredentials.from_json_keyfile_name( path_to_service_account_json_file, scopes=API_SCOPES) # Configure impersonation (if applicable). if impersonation_email: credentials = credentials.create_delegated(impersonation_email) # Use the credentials to authorize an httplib2.Http instance. http = credentials.authorize(httplib2.Http()) return http if __name__ == '__main__': main(sys.argv)
PHP
/** * This example demonstrates how to authenticate using a service account. * * The optional flag email parameter only applies to service accounts which have * domain-wide delegation enabled and wish to make API requests on behalf of an * account within that domain. Using this flag will not allow you to impersonate * a user from a domain that you don't own (e.g., gmail.com). */ class AuthenticateUsingServiceAccount { // The OAuth 2.0 scopes to request. private static $OAUTH_SCOPES = [Google_Service_DisplayVideo::DISPLAY_VIDEO]; public function run($pathToJsonFile, $email = null) { // Create an authenticated client object. $client = $this->createAuthenticatedClient($pathToJsonFile, $email); // Create a Dfareporting service object. $service = new Google_Service_DisplayVideo($client); // Make API requests. } private function createAuthenticatedClient($pathToJsonFile, $email) { // Create a Google_Client instance. // // Note: application name should be replaced with a value that identifies // your application. Suggested format is "MyCompany-ProductName". $client = new Google_Client(); $client->setApplicationName('PHP service account sample'); $client->setScopes(self::$OAUTH_SCOPES); // Load the service account credentials. $client->setAuthConfig($pathToJsonFile); // Configure impersonation (if applicable). if (!is_null($email)) { $client->setSubject($email); } return $client; } }