المصادقة كتطبيق Google Chat

يوضِّح هذا الدليل كيفية إعداد حساب خدمة واستخدامه للوصول إلى Google Chat API نيابةً عن تطبيق في Chat. يرشدك أولاً إلى طريقة إنشاء حساب خدمة. يشرح القسم بعد ذلك كيفية كتابة نص برمجي يستخدم حساب الخدمة للمصادقة باستخدام Chat API ونشر رسالة في "مساحة Chat".

يمكن لتطبيقات Chat استخدام حسابات الخدمة للمصادقة عند الاتصال بواجهة برمجة تطبيقات Google Chat بشكل غير متزامن، وذلك كي تتمكّن من إجراء ما يلي:

  • يمكنك إرسال رسائل إلى Google Chat باستخدام spaces.messages.create لإجراء ما يلي:
    • إشعار المستخدمين عند انتهاء تنفيذ مهمة طويلة الأمد في الخلفية
    • تنبيه المستخدمين بأن الخادم أصبح بلا اتصال بالإنترنت.
    • اطلب من أحد موظفي دعم العملاء الميل إلى حالة العملاء المفتوحة حديثًا.
  • يمكنك تعديل الرسائل المرسَلة سابقًا باستخدام spaces.messages.update من أجل:
    • تغيير حالة في حالة "قيد التشغيل".
    • تعديل المستخدم الذي تم إسناد المهمة إليه أو تاريخ تسليمها
  • أدرِج المستخدمين في مساحة باستخدام spaces.members.list لإجراء ما يلي:
    • التعرّف على المشاركين في المساحة
    • تحقَّق من أنّ عضوية المساحة تشمل جميع الأعضاء في الفريق.

عند المصادقة باستخدام حساب خدمة، يجب أن تكون تطبيقات Chat عضوية في المساحة للحصول على بيانات حول الإجراءات أو تنفيذها في مساحة Chat. على سبيل المثال، لإدراج أعضاء مساحة أو لإنشاء رسالة في مساحة، يجب أن يكون تطبيق Chat عضوًا في المساحة.

إذا كان تطبيق Chat يحتاج إلى الوصول إلى بيانات المستخدم أو تنفيذ إجراءات نيابةً عنه، يمكنك المصادقة كمستخدم بدلاً من ذلك.

إذا كنت مشرف نطاق، يمكنك منح تفويض على مستوى النطاق للسماح لحساب خدمة التطبيق بالوصول إلى بيانات المستخدمين بدون أن تطلب من كل مستخدم تقديم موافقته. بعد ضبط التفويض على مستوى النطاق، يمكنك إجراء طلبات بيانات من واجهة برمجة التطبيقات باستخدام حساب الخدمة لانتحال هوية حساب مستخدم. على الرغم من استخدام حساب الخدمة للمصادقة، إلا أن التفويض على مستوى النطاق ينتحل هوية المستخدم، وبالتالي يُعتبر مصادقة المستخدم. يمكنك استخدام التفويض على مستوى النطاق مع أي وظيفة تتطلب مصادقة المستخدم

لمزيد من المعلومات حول الحالات التي تتطلّب فيها التطبيقات في Chat المصادقة ونوع المصادقة الذي يجب استخدامه، يمكنك الاطّلاع على المقالة أنواع المصادقة المطلوبة في النظرة العامة على المصادقة والترخيص في Chat API.

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

لتشغيل المثال في هذا الدليل، تحتاج إلى المتطلبات الأساسية التالية:

إضافةً إلى ذلك، تحتاج إلى المتطلبات الأساسية التالية الخاصة باللغة:

Java

  • JDK 1.7 أو أكبر
  • أداة إدارة الحِزم في Maven
  • مشروع Maven مهيأ. لتهيئة مشروع جديد، شغل الأمر التالي في واجهة سطر الأوامر:

    mvn archetype:generate -DgroupId=com.google.chat.app.authsample -DartifactId=auth-sample-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    

Python

  • Python 3.6 أو أحدث
  • إنّ أداة إدارة الحِزم pip

Node.js

  • Node.js
  • أداة إدارة الحِزم npm
  • مشروع Node.js مهيأ. لتهيئة مشروع جديد، قم بإنشاء والتبديل إلى مجلد جديد، ثم قم بتشغيل الأمر التالي في واجهة سطر الأوامر لديك:

    npm init
    

برمجة تطبيقات

الخطوة 1: إنشاء حساب خدمة في Google Cloud Console

أنشِئ حساب خدمة يمكن أن يستخدمه تطبيق Chat للوصول إلى Google APIs.

إنشاء حساب خدمة

لإنشاء حساب خدمة، اتّبِع الخطوات التالية:

وحدة تحكُّم Google Cloud

  1. في Google Cloud Console، انتقِل إلى القائمة > إدارة الهوية وإمكانية الوصول والمشرف > حسابات الخدمة.

    الانتقال إلى حسابات الخدمة

  2. انقر على إنشاء حساب خدمة.
  3. املأ تفاصيل حساب الخدمة، ثم انقر على إنشاء ومتابعة.
  4. اختياري: عيّن الأدوار لحساب الخدمة لمنح الإذن بالوصول إلى موارد مشروعك على Google Cloud. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة منح الموارد وتغييرها وإبطالها.
  5. انقر على متابعة.
  6. اختياري: أدخِل المستخدمين أو المجموعات التي يمكنها إدارة الإجراءات وتنفيذها باستخدام حساب الخدمة هذا. للتعرُّف على المزيد من التفاصيل، يُرجى الاطِّلاع على إدارة انتحال هوية حساب الخدمة.
  7. انقر على تم. دوِّن عنوان البريد الإلكتروني لحساب الخدمة.

gcloud CLI

  1. أنشئ حساب الخدمة:
    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name="SERVICE_ACCOUNT_NAME"
  2. اختياري: عيّن الأدوار لحساب الخدمة لمنح الإذن بالوصول إلى موارد مشروعك على Google Cloud. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة منح الموارد وتغييرها وإبطالها.

ويظهر حساب الخدمة في صفحة حساب الخدمة. بعد ذلك، أنشئ مفتاحًا خاصًا لحساب الخدمة

إنشاء مفتاح خاص

لإنشاء مفتاح خاص وتنزيله لحساب الخدمة، اتّبِع الخطوات التالية:

  1. في Google Cloud Console، انتقِل إلى القائمة > إدارة الهوية وإمكانية الوصول والمشرف > حسابات الخدمة.

    الانتقال إلى حسابات الخدمة

  2. اختَر حساب الخدمة.
  3. انقر على المفاتيح > إضافة مفتاح > إنشاء مفتاح جديد.
  4. اختَر JSON، ثم انقر على إنشاء.

    يتم إنشاء زوج المفتاح العام/الخاص وتنزيله على جهازك كملف جديد. احفظ ملف JSON الذي تم تنزيله بتنسيق credentials.json في دليل العمل. وهذا الملف هو النسخة الوحيدة من هذا المفتاح. للحصول على معلومات حول طريقة تخزين المفتاح بأمان، يُرجى الاطّلاع على إدارة مفاتيح حساب الخدمة.

  5. انقر على إغلاق.

لمزيد من المعلومات حول حسابات الخدمة، يُرجى الاطّلاع على حسابات الخدمة في مستندات "إدارة الهوية وإمكانية الوصول" لخدمة Google Cloud.

الخطوة 2: تثبيت مكتبة برامج Google وغيرها من البرامج الاعتمادية

تثبيت مكتبة برامج Google والتبعيات الأخرى المطلوبة للمشروع.

Java

لإضافة مكتبات عملاء Google والتبعيات المطلوبة الأخرى إلى مشروع Maven، عدِّل الملف pom.xml في دليل مشروعك، وأضِف التبعيات التالية:

<dependencies>
  <!-- ... existing dependencies ... -->
  <dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-chat</artifactId>
    <version>v1-rev20230905-2.0.0</version>
  </dependency>
  <dependency>
    <groupId>com.google.auth</groupId>
    <artifactId>google-auth-library-oauth2-http</artifactId>
    <version>1.19.0</version>
  </dependency>
  <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.10.1</version>
  </dependency>
</dependencies>

Python

إذا لم تكن قد قمت بالفعل بتثبيت مكتبات عملاء Google للغة بايثون، فقم بتشغيل الأمر التالي في واجهة سطر الأوامر:

pip3 install --upgrade google-api-python-client google-auth

Node.js

لإضافة مكتبات عملاء Google إلى مشروع Node.js، قم بالتبديل إلى دليل المشروع الخاص بك وقم بتشغيل الأمر التالي في واجهة سطر الأوامر لديك:

npm install "@googleapis/chat"

برمجة تطبيقات

يستخدم هذا النموذج بروتوكول OAuth2 لمكتبة برمجة التطبيقات لإنشاء رمز JWT المميز لمصادقة حساب الخدمة. لإضافة المكتبة إلى مشروع "برمجة تطبيقات Google":

  1. على يمين الصفحة، انقر على أداة التعديل .
  2. على يمين الصفحة، بجانب المكتبات، انقر على إضافة مكتبة .
  3. أدخِل رقم تعريف النص البرمجي 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF.
  4. انقر على بحث، ثم انقر على إضافة.

يستخدم هذا النموذج خدمة الدردشة المتقدّمة لطلب بيانات من Google Chat API. لتشغيل الخدمة لمشروع "برمجة التطبيقات":

  1. على يمين الصفحة، انقر على أداة التعديل .
  2. على يمين الصفحة، بجانب الخدمات، انقر على إضافة خدمة .
  3. اختَر Google Chat API.
  4. في الإصدار، اختَر الإصدار 1.
  5. انقر على إضافة.

يمكنك استخدام أي لغة معتمَدة في مكتبات العملاء.

الخطوة 3: كتابة نص برمجي يستخدم حساب الخدمة للمصادقة باستخدام Chat API

تتم مصادقة الرمز التالي مع Chat API باستخدام حساب خدمة، ثم نشر رسالة على "مساحة Chat":

Java

  1. في دليل مشروعك، افتح الملف src/main/java/com/google/chat/app/authsample/App.java.
  2. استبدِل المحتوى في App.java بالرمز التالي:

    package com.google.chat.app.authsample;
    
    import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
    import com.google.api.client.http.HttpRequestInitializer;
    import com.google.api.client.json.gson.GsonFactory;
    import com.google.api.services.chat.v1.HangoutsChat;
    import com.google.api.services.chat.v1.model.Message;
    import com.google.auth.http.HttpCredentialsAdapter;
    import com.google.auth.oauth2.GoogleCredentials;
    
    /**
     * Authenticates with Chat API via service account credentials,
     * then creates a Chat message.
     */
    public class App {
        // Specify required scopes.
        private static final String CHAT_SCOPE = "https://www.googleapis.com/auth/chat.bot";
    
        // Specify service account details.
        private static final String PRIVATE_KEY_RESOURCE_URI = "/credentials.json";
    
        public static void main( String[] args ) {
            try {
                // Run app.
                Message response = App.createChatMessage();
                // Print details about the created message.
                System.out.println(response);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static Message createChatMessage() throws Exception {
            // Build the Chat API client and authenticate with the service account.
            GoogleCredentials credentials = GoogleCredentials.fromStream(
                App.class.getResourceAsStream(PRIVATE_KEY_RESOURCE_URI))
                .createScoped(CHAT_SCOPE);
            HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);
            HangoutsChat chatService = new HangoutsChat.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                GsonFactory.getDefaultInstance(),
                requestInitializer)
                .setApplicationName("auth-sample-app")
                .build();
    
            // The space to create the message in.
            //
            // Replace SPACE_NAME with a space name.
            // Obtain the space name from the spaces resource of Chat API,
            // or from a space's URL.
            String spaceName = "spaces/SPACE_NAME";
    
            // Create a Chat message.
            Message message = new Message().setText("Hello, world!");
            return chatService.spaces().messages().create(spaceName, message).execute();
        }
    }
    
  3. في الرمز، استبدِل SPACE_NAME باسم مساحة، يمكنك الحصول عليه من الطريقة spaces.list في Chat API أو من عنوان URL الخاص بالمساحة.

  4. أنشِئ دليلاً فرعيًا جديدًا باسم resources ضمن دليل مشروعك.

  5. تأكَّد من تسمية ملف المفتاح الخاص لحساب الخدمة credentials.json وانسخه إلى الدليل الفرعي "resources".

  6. لإعداد Maven لتضمين ملف المفتاح الخاص في حزمة المشروع، يمكنك تعديل الملف pom.xml في دليل مشروعك وإضافة الإعدادات التالية إلى قسم <build>:

    <build>
      <!-- ... existing configurations ... -->
      <resources>
        <resource>
          <directory>resources</directory>
        </resource>
      </resources>
    </build>
    
  7. لإعداد Maven لتضمين التبعيات في حزمة المشروع وتنفيذ الفئة الرئيسية لتطبيقك، يمكنك تعديل الملف pom.xml في دليل المشروع وإضافة الإعدادات التالية إلى القسم <plugins>:

    <plugins>
      <!-- ... existing configurations ... -->
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.google.chat.app.authsample.App</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
    

Python

  1. في دليل العمل، أنشِئ ملفًا باسم chat_app_auth.py.
  2. ضمِّن الرمز التالي في chat_app_auth.py:

    from apiclient.discovery import build
    from google.oauth2 import service_account
    
    # Specify required scopes.
    SCOPES = ['https://www.googleapis.com/auth/chat.bot']
    
    # Specify service account details.
    CREDENTIALS = service_account.Credentials.from_service_account_file(
        'credentials.json', scopes=SCOPES)
    
    # Build the URI and authenticate with the service account.
    chat = build('chat', 'v1', credentials=CREDENTIALS)
    
    # Create a Chat message.
    result = chat.spaces().messages().create(
    
        # The space to create the message in.
        #
        # Replace SPACE_NAME with a space name.
        # Obtain the space name from the spaces resource of Chat API,
        # or from a space's URL.
        parent='spaces/SPACE_NAME',
    
        # The message to create.
        body={'text': 'Hello, world!'}
    
    ).execute()
    
    # Prints details about the created message.
    print(result)
    
  3. في الرمز، استبدِل SPACE_NAME باسم مساحة، يمكنك الحصول عليه من الطريقة spaces.list في Chat API أو من عنوان URL الخاص بالمساحة. تأكَّد من تسمية ملف المفتاح الخاص لحساب الخدمة باسم credentials.json.

Node.js

  1. في دليل مشروعك، أنشِئ ملفًا باسم chat_app_auth.js.
  2. ضمِّن الرمز التالي في chat_app_auth.js:

    const chat = require('@googleapis/chat');
    
    async function createMessage() {
      const auth = new chat.auth.GoogleAuth({
    
        // Specify service account details.
        keyFilename: 'credentials.json',
    
        // Specify required scopes.
        scopes: ['https://www.googleapis.com/auth/chat.bot']
    
      });
      const authClient = await auth.getClient();
    
      // Create the Chat API client and authenticate with the service account.
      const chatClient = await chat.chat({
        version: 'v1',
        auth: authClient
      });
    
      // Create a Chat message.
      const result = await chatClient.spaces.messages.create({
    
        // The space to create the message in.
        //
        // Replace SPACE_NAME with a space name.
        // Obtain the space name from the spaces resource of Chat API,
        // or from a space's URL.
        parent: 'spaces/SPACE_NAME',
    
        // The message to create.
        requestBody: { 'text': 'Hello, world!' }
    
      });
      return result;
    }
    
    // Execute function then print details about the created message.
    createMessage().then(console.log);
    
  3. في الرمز، استبدِل SPACE_NAME باسم مساحة، يمكنك الحصول عليه من الطريقة spaces.list في Chat API أو من عنوان URL الخاص بالمساحة. تأكَّد من تسمية ملف المفتاح الخاص لحساب الخدمة باسم credentials.json.

برمجة تطبيقات

  1. في محرِّر "برمجة تطبيقات Google"، عدِّل الملف appsscript.json وأضِف نطاق OAuth اللازم لإجراء طلبات خارجية للحصول على رمز OAuth المميز لحساب الخدمة:

      "oauthScopes": [
        "https://www.googleapis.com/auth/script.external_request"
      ]
    
  2. احفظ الرمز التالي في ملف باسم ChatAppAuth.gs في مشروع برمجة التطبيقات:

    // Specify the contents of the file credentials.json.
    const CREDENTIALS = CREDENTIALS;
    
    const SCOPE = 'https://www.googleapis.com/auth/chat.bot';
    
    // The space to create the message in.
    //
    // Replace SPACE_NAME with a space name.
    // Obtain the space name from the spaces resource of Chat API,
    // or from a space's URL.
    const PARENT = 'spaces/SPACE_NAME'
    
    /**
     * Authenticates with Chat API via app credentials, then posts a message.
     */
    function createMessageWithAppCredentials() {
      try {
        const service = getService_();
        if (!service.hasAccess()) {
          console.error(service.getLastError());
          return;
        }
    
        // Specify the message to create.
        const message = {'text': 'Hello world!'};
    
        // Call Chat API with a service account to create a message.
        const result = Chat.Spaces.Messages.create(
            message,
            PARENT,
            {},
            // Authenticate with the service account token.
            {'Authorization': 'Bearer ' + service.getAccessToken()});
    
        // Log details about the created message.
        console.log(result);
    
      } catch (err) {
        // TODO (developer) - Handle exception.
        console.log('Failed to create message with error %s', err.message);
      }
    }
    
    /**
     * Configures the OAuth library to authenticate with the service account.
     */
    function getService_() {
      return OAuth2.createService(CREDENTIALS.client_email)
          .setTokenUrl('https://oauth2.googleapis.com/token')
          .setPrivateKey(CREDENTIALS.private_key)
          .setIssuer(CREDENTIALS.client_email)
          .setSubject(CREDENTIALS.client_email)
          .setScope(SCOPE)
          .setPropertyStore(PropertiesService.getScriptProperties());
    }
    
  3. في الرمز، استبدل CREDENTIALS بمحتوى الملف credentials.json.

  4. في الرمز، استبدِل SPACE_NAME باسم مساحة، يمكنك الحصول عليه من الطريقة spaces.list في Chat API أو من عنوان URL الخاص بالمساحة.

الخطوة 4: تشغيل المثال الكامل

في دليل العمل، أنشئ النموذج وقم بتشغيله:

Java

mvn compile assembly:single
java -jar target/auth-sample-app-1.0-SNAPSHOT-jar-with-dependencies.jar

Python

python3 chat_app_auth.py

Node.js

node chat_app_auth.js

برمجة تطبيقات

افتح الملف ChatAppAuth.gs في "محرِّر برمجة التطبيقات" وانقر على تشغيل.

يُنشئ النص البرمجي طلبًا تمت مصادقته إلى Chat API، التي تستجيب من خلال نشر رسالة في مساحة Chat كتطبيق Chat.

تحديد المشاكل وحلّها في المثال

يصف هذا القسم المشاكل الشائعة التي قد تواجهها أثناء محاولة تشغيل هذا النموذج.

لا يُسمَح لك باستخدام هذا التطبيق.

عند تشغيل النص البرمجي، قد تتلقى رسالة خطأ تفيد بما يلي:

<HttpError 403 when requesting https://chat.googleapis.com/v1/spaces/{space}/messages?alt=json returned "You are not permitted to use this app". Details: "You are not permitted to use this app">

تعني رسالة الخطأ هذه أنّ تطبيق Chat لا يملك الإذن بإنشاء رسائل Chat في "مساحة Chat" المحدّدة.

لحل هذا الخطأ، عليك إضافة تطبيق Chat إلى "مساحة Chat" المحدّد في النص البرمجي.

يمكنك التعرّف على الإجراءات الأخرى التي يمكن تنفيذها في Chat API من خلال مراجعة المستندات المرجعية الخاصة بواجهة Chat API.