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

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

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

  • إرسال رسائل إلى 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

Node.js

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

    npm init
    

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

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

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

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

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

وحدة التحكّم في Google Cloud

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

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

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

واجهة سطر الأوامر gcloud

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

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

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

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

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

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

  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 للغة Python، شغِّل الأمر التالي في واجهة سطر الأوامر:

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

Node.js

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

npm install "@googleapis/chat"

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

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

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

يستخدم هذا النموذج دالة خدمة Chat المتقدّمة لاستدعاء 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 في مشروع "برمجة تطبيقات Google":

    // 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 المستندات المرجعية