به عنوان یک برنامه چت Google احراز هویت

این راهنما نحوه راه‌اندازی و استفاده از یک حساب سرویس برای دسترسی به Google Chat API از طرف یک برنامه Chat را توضیح می‌دهد. ابتدا نحوه ایجاد یک حساب سرویس را به شما آموزش می دهد. سپس، نحوه نوشتن یک اسکریپت را نشان می دهد که از حساب سرویس برای احراز هویت با Chat API و ارسال پیام در فضای چت استفاده می کند.

برنامه‌های چت می‌توانند از حساب‌های سرویس برای احراز هویت در هنگام تماس ناهمزمان با Google Chat API استفاده کنند تا بتوانند:

  • ارسال پیام به Google Chat با spaces.messages.create به:
    • وقتی یک کار پس‌زمینه طولانی‌مدت اجرا به پایان رسید، به کاربران اطلاع دهید.
    • به کاربران هشدار دهید که یک سرور آفلاین شده است.
    • از یک فرد پشتیبانی مشتری بخواهید که به یک پرونده مشتری تازه باز شده مراجعه کند.
  • پیام‌های ارسال شده قبلی را با spaces.messages.update به‌روزرسانی کنید:
    • وضعیت عملیات در حال انجام را تغییر دهید.
    • تکلیف یا تاریخ سررسید یک کار را به روز کنید.
  • فهرست کاربران در یک فضای با spaces.members.list به:
    • ببینید چه کسی در یک فضا است.
    • تأیید عضویت در فضا شامل همه اعضای یک تیم می‌شود.

هنگامی که با یک حساب سرویس احراز هویت می‌شوند، برنامه‌های گپ برای دریافت داده‌ها یا انجام اقدامات در فضای گپ باید در این فضا عضویت داشته باشند. برای مثال، برای فهرست کردن اعضای یک فضا، یا ایجاد پیام در یک فضا، برنامه چت باید خود عضوی از فضا باشد.

اگر برنامه چت شما نیاز به دسترسی به داده‌های کاربر یا انجام اقداماتی از طرف یک کاربر دارد، در عوض به عنوان کاربر احراز هویت کنید .

اگر یک سرپرست دامنه هستید، می‌توانید اختیاری را در سراسر دامنه اعطا کنید تا به حساب سرویس یک برنامه اجازه دسترسی به داده‌های کاربران شما را بدون نیاز به رضایت هر کاربر بدهد. پس از پیکربندی نمایندگی در سراسر دامنه، می‌توانید با استفاده از حساب سرویس خود برای جعل هویت یک حساب کاربری، تماس‌های API برقرار کنید . اگرچه یک حساب سرویس برای احراز هویت استفاده می‌شود، اما تفویض اختیار در دامنه، هویت کاربر را جعل می‌کند و بنابراین احراز هویت کاربر در نظر گرفته می‌شود. هر عملکردی که نیاز به احراز هویت کاربر داشته باشد، می‌توانید از تفویض اختیار در سطح دامنه استفاده کنید.

برای اطلاعات بیشتر در مورد اینکه چه زمانی برنامه‌های گپ به احراز هویت نیاز دارند و از چه نوع احراز هویتی استفاده می‌کنند، به انواع احراز هویت مورد نیاز در نمای کلی احراز هویت و مجوز Chat API مراجعه کنید.

پیش نیازها

برای اجرای مثال در این راهنما، به پیش نیازهای زیر نیاز دارید:

علاوه بر این، به پیش نیازهای خاص زبان زیر نیاز دارید:

جاوا

  • 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
    

پایتون

  • پایتون 3.6 یا بالاتر
  • ابزار مدیریت بسته پیپ

Node.js

  • Node.js
  • ابزار مدیریت بسته npm
  • یک پروژه Node.js اولیه. برای مقداردهی اولیه یک پروژه جدید، یک پوشه جدید ایجاد کرده و به آن سوئیچ کنید، سپس دستور زیر را در رابط خط فرمان خود اجرا کنید:

    npm init
    

اسکریپت برنامه ها

مرحله 1: یک حساب سرویس در کنسول Google Cloud ایجاد کنید

یک حساب سرویس ایجاد کنید که برنامه Chat شما بتواند از آن برای دسترسی به APIهای Google استفاده کند.

یک حساب کاربری ایجاد کنید

برای ایجاد یک حساب کاربری، مراحل زیر را دنبال کنید:

کنسول Google Cloud

  1. در کنسول Google Cloud، به منو > IAM & Admin > حساب‌های سرویس بروید.

    به حساب های خدماتی بروید

  2. روی ایجاد حساب سرویس کلیک کنید.
  3. جزئیات حساب سرویس را پر کنید، سپس روی ایجاد و ادامه کلیک کنید.
  4. اختیاری: نقش هایی را به حساب سرویس خود اختصاص دهید تا به منابع پروژه Google Cloud خود دسترسی داشته باشید. برای جزئیات بیشتر، به اعطای، تغییر، و لغو دسترسی به منابع مراجعه کنید.
  5. روی Continue کلیک کنید.
  6. اختیاری: کاربران یا گروه‌هایی را وارد کنید که می‌توانند عملکردها را با این حساب سرویس مدیریت و انجام دهند. برای جزئیات بیشتر، به مدیریت جعل هویت حساب سرویس مراجعه کنید.
  7. روی Done کلیک کنید. آدرس ایمیل حساب سرویس را یادداشت کنید.

gcloud CLI

  1. حساب سرویس را ایجاد کنید:
    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name="SERVICE_ACCOUNT_NAME"
  2. اختیاری: نقش هایی را به حساب سرویس خود اختصاص دهید تا به منابع پروژه Google Cloud خود دسترسی داشته باشید. برای جزئیات بیشتر، به اعطای، تغییر، و لغو دسترسی به منابع مراجعه کنید.

حساب سرویس در صفحه حساب سرویس ظاهر می شود. بعد، یک کلید خصوصی برای حساب سرویس ایجاد کنید.

یک کلید خصوصی ایجاد کنید

برای ایجاد و دانلود یک کلید خصوصی برای حساب سرویس، مراحل زیر را دنبال کنید:

  1. در کنسول Google Cloud، به منو > IAM & Admin > حساب‌های سرویس بروید.

    به حساب های خدماتی بروید

  2. حساب سرویس خود را انتخاب کنید.
  3. روی کلیدها > افزودن کلید > ایجاد کلید جدید کلیک کنید.
  4. JSON را انتخاب کنید، سپس روی ایجاد کلیک کنید.

    جفت کلید عمومی/خصوصی جدید شما تولید شده و به عنوان یک فایل جدید در دستگاه شما دانلود می شود. فایل JSON دانلود شده را به عنوان credentials.json در فهرست کاری خود ذخیره کنید. این فایل تنها کپی این کلید است. برای اطلاعات در مورد نحوه ذخیره ایمن کلید خود، به مدیریت کلیدهای حساب سرویس مراجعه کنید.

  5. روی Close کلیک کنید.

برای اطلاعات بیشتر درباره حساب‌های خدمات، به حساب‌های خدمات در اسناد Google Cloud IAM مراجعه کنید.

مرحله 2: کتابخانه مشتری Google و سایر وابستگی ها را نصب کنید

کتابخانه مشتری Google و سایر وابستگی های مورد نیاز برای پروژه را نصب کنید.

جاوا

برای افزودن کتابخانه های سرویس گیرنده 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>

پایتون

اگر قبلاً کتابخانه های سرویس گیرنده Google را برای پایتون نصب نکرده اید، دستور زیر را در رابط خط فرمان خود اجرا کنید:

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

Node.js

برای افزودن کتابخانه های سرویس گیرنده Google به پروژه Node.js خود، به دایرکتوری پروژه خود بروید و دستور زیر را در رابط خط فرمان خود اجرا کنید:

npm install "@googleapis/chat"

اسکریپت برنامه ها

این نمونه از کتابخانه OAuth2 for Apps Script برای تولید یک نشانه JWT برای احراز هویت حساب سرویس استفاده می کند. برای افزودن کتابخانه به پروژه Apps Script:

  1. در سمت چپ، روی ویرایشگر کلیک کنید.
  2. در سمت چپ، در کنار کتابخانه‌ها ، روی افزودن کتابخانه کلیک کنید.
  3. شناسه اسکریپت 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF را وارد کنید.
  4. روی Look up کلیک کنید، سپس روی Add کلیک کنید.

این نمونه از سرویس Advanced Chat برای فراخوانی Google Chat API استفاده می کند. برای روشن کردن سرویس پروژه Apps Script:

  1. در سمت چپ، روی ویرایشگر کلیک کنید.
  2. در سمت چپ، در کنار خدمات ، روی افزودن سرویس کلیک کنید.
  3. Google Chat API را انتخاب کنید.
  4. در نسخه ، v1 را انتخاب کنید.
  5. روی افزودن کلیک کنید.

شما می توانید از هر زبانی که توسط کتابخانه های مشتری ما پشتیبانی می شود استفاده کنید.

مرحله 3: اسکریپتی بنویسید که از حساب سرویس برای احراز هویت با Chat API استفاده کند

کد زیر با استفاده از یک حساب سرویس با Chat API احراز هویت می‌شود، سپس پیامی را به فضای چت ارسال می‌کند:

جاوا

  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>
    

پایتون

  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. در ویرایشگر Apps Script، فایل appsscript.json را ویرایش کنید و محدوده OAuth لازم برای درخواست‌های خارجی برای دریافت رمز OAuth حساب سرویس را اضافه کنید:

      "oauthScopes": [
        "https://www.googleapis.com/auth/script.external_request"
      ]
    
  2. کد زیر را در فایلی به نام ChatAppAuth.gs در پروژه Apps Script خود ذخیره کنید:

    // 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.json را جایگزین CREDENTIALS کنید.

  4. در کد، SPACE_NAME با نام فضایی جایگزین کنید، که می‌توانید آن را از روش spaces.list در Chat API یا از URL یک فضا دریافت کنید.

مرحله 4: مثال کامل را اجرا کنید

در پوشه کاری خود، نمونه را بسازید و اجرا کنید:

جاوا

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

پایتون

python3 chat_app_auth.py

Node.js

node chat_app_auth.js

اسکریپت برنامه ها

فایل ChatAppAuth.gs را در Apps Script Editor باز کنید و روی Run کلیک کنید.

اسکریپت شما یک درخواست احراز هویت به Chat API ارائه می‌کند که با ارسال پیامی در فضای چت به‌عنوان برنامه چت پاسخ می‌دهد.

عیب یابی مثال

این بخش مشکلات رایجی را که ممکن است هنگام تلاش برای اجرای این نمونه با آن مواجه شوید، توضیح می دهد.

شما مجاز به استفاده از این برنامه نیستید

هنگام اجرای اسکریپت، ممکن است خطایی دریافت کنید که می گوید:

<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 API، بدانید که Chat API چه کارهای دیگری می تواند انجام دهد.