استخدام حساب خدمة

حساب الخدمة هو نوع من حسابات Google يمكن استخدامه من خلال أحد التطبيقات للوصول إلى Google APIs آليًا عبر OAuth 2.0. ولا يتطلب ذلك تفويضًا بشري، ولكنه يستخدم بدلاً من ذلك ملفًا رئيسيًا يمكن للتطبيق فقط الوصول إليه.

قبل قراءة المزيد من المعلومات عن حسابات الخدمة، يمكنك اتّباع تدفق التطبيقات المثبَّت على OAuth 2.0 الأبسط والأكثر اقتراحًا. يتطلّب هذا التدفق تفاعلاً يدويًا من المستخدم لاعتماد تطبيقك، إلا أنّه يجب تنفيذ هذه الخطوة مرة واحدة فقط ولا يلزم تنفيذها في بيئة الإنتاج. لا تنتهي صلاحية رموز إعادة التحميل التي يتم إنشاؤها من خلال هذا التدفق مطلقًا، ويمكن تخزينها مؤقتًا وتوزيعها في بيئات مختلفة، ويمكن استخدامها لإنشاء رموز دخول عند الطلب بدون تفاعل المستخدم.

هل ما زلت تقرأ؟ حسنًا، يمكنك استخدام حساب الخدمة بأيّ من الطريقتَين التاليتَين:

  • أنشئ مستخدمًا في "مساحة العرض والفيديو 360" مرتبط بحساب الخدمة. في هذا السيناريو، يتصرف حساب الخدمة كحساب مستخدم عادي ويسمح لك بالوصول إلى جميع الشركاء والمعلِنين الذين تمت إدارة حساباتهم للمستخدمين. هذه هي الطريقة المفضّلة لاستخدام حسابات الخدمة مع "مساحة العرض والفيديو 360"
  • يمكنك استخدام التفويض على مستوى النطاق لإرسال طلبات بالنيابة عن مستخدم واحد أو أكثر من مستخدمي "مساحة العرض والفيديو 360" الذين تم ربط حساباتهم بحسابات ضمن نطاق G Suite. وفي هذه الحالة، يجب أن يكون لديك إذن وصول المشرف إلى النطاق الهدف. للحصول على مساعدة بشأن G Suite و/أو ضبط النطاق، يُرجى الاطّلاع على صفحة دعم G Suite.

المتطلبات الأساسية

لاستخدام حساب خدمة مرتبط بأحد مستخدمي "مساحة العرض والفيديو 360"، اختَر علامة التبويب مستخدم "مساحة العرض والفيديو 360" أدناه. لاستخدام التفويض على مستوى النطاق، اختَر علامة التبويب التفويض.

مستخدم في "مساحة العرض والفيديو 360"

يجب أن يكون لديك مستخدم "مساحة العرض والفيديو 360" مرتبط بحساب الخدمة.

التفويض

  1. يجب أن يكون لديك إذن وصول المشرف إلى نطاق مسجَّل في G Suite.
  2. يجب أن يكون لديك مستخدم واحد أو أكثر من مستخدمي "مساحة العرض والفيديو 360" مرتبطين بحسابات ضمن نطاقك المسجَّل على G Suite. ولا يمكن استخدام المستخدمين المرتبطين بحسابات ضمن نطاقات أخرى (على سبيل المثال، gmail.com).

ضبط واستخدام حساب خدمة

مستخدم في "مساحة العرض والفيديو 360"

  1. أنشئ مفتاح حساب خدمة في وحدة التحكم في واجهة Google API.

  2. اربط مستخدم "مساحة العرض والفيديو 360" بعنوان البريد الإلكتروني لحساب الخدمة الذي تم الحصول عليه في الخطوة السابقة كما هو موضَّح في مقالة إدارة المستخدمين في "مساحة العرض والفيديو 360".

  3. تنفيذ مسار OAuth 2.0 من خادم إلى خادم في تطبيقك باستخدام حساب الخدمة الذي تم إنشاؤه حديثًا. لمزيد من المعلومات، يُرجى الاطّلاع على القسم أمثلة.

التفويض

  1. أنشئ مفتاح حساب خدمة في وحدة التحكم في واجهة Google API.

  2. يمكنك تفويض السلطة على مستوى النطاق لحساب الخدمة هذا للسماح له بانتحال هوية المستخدمين داخل نطاقك. يُرجى تقديم نطاقات واجهة برمجة التطبيقات التالية عندما يُطلب منك ذلك:

    النطاق المعنى
    https://www.googleapis.com/auth/display-video الإذن بالقراءة/الكتابة
    https://www.googleapis.com/auth/display-video-user-management الإذن بالقراءة/الكتابة في خدمة "users" يتوفّر هذا الخيار لمستخدمي حسابات الخدمة فقط.

  3. تنفيذ مسار 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.v3.DisplayVideo;
import com.google.api.services.displayvideo.v3.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 ImmutableSet OAUTH_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 = 'v3'
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;
    }
}