ตรวจสอบสิทธิ์เป็นแอป Google Chat

คู่มือนี้จะอธิบายถึงวิธีตั้งค่าและใช้บัญชีบริการเพื่อเข้าถึง Google Chat API ในนามของแอป Chat โดยก่อนอื่น เราจะแนะนำวิธีสร้างบัญชีบริการ จากนั้นจะสาธิตวิธีเขียนสคริปต์ที่ใช้บัญชีบริการเพื่อตรวจสอบสิทธิ์กับ Chat API และโพสต์ข้อความในพื้นที่ใน Chat

แอป Chat จะใช้บัญชีบริการในการตรวจสอบสิทธิ์เมื่อเรียกใช้ Google Chat API แบบไม่พร้อมกันเพื่อให้ดำเนินการต่อไปนี้ได้

  • ส่งข้อความถึง Google Chat ด้วย spaces.messages.create ไปยัง
    • แจ้งเตือนผู้ใช้เมื่องานที่ทำอยู่เบื้องหลังซึ่งใช้เวลานานดำเนินการเสร็จสิ้น
    • แจ้งเตือนผู้ใช้ว่าเซิร์ฟเวอร์ออฟไลน์
    • ขอให้เจ้าหน้าที่ฝ่ายสนับสนุนลูกค้ามีแนวโน้มจะยื่นเคสลูกค้าที่เปิดใหม่
  • อัปเดตข้อความที่ส่งก่อนหน้านี้ด้วย spaces.messages.update ถึง:
    • เปลี่ยนสถานะของ "อยู่ระหว่างดำเนินการ"
    • อัปเดตผู้ได้รับมอบหมายหรือวันที่ครบกำหนดของงาน
  • แสดงรายการผู้ใช้ในพื้นที่ทำงานด้วย spaces.members.list เพื่อทำสิ่งต่อไปนี้
    • ดูผู้ที่อยู่ในพื้นที่ทำงาน
    • ยืนยันการเป็นสมาชิกพื้นที่ทำงานจะรวมทุกคนในทีม

เมื่อตรวจสอบสิทธิ์ด้วยบัญชีบริการแล้ว หากต้องการรับข้อมูลหรือดำเนินการต่างๆ ในพื้นที่ใน Chat แอปใน Chat จะต้องเป็นสมาชิกในพื้นที่ทำงานดังกล่าว เช่น หากต้องการให้แสดงรายชื่อสมาชิกพื้นที่ทำงานหรือสร้างข้อความในพื้นที่ทำงาน แอป Chat จะต้องเป็นสมาชิกของพื้นที่ทำงานนั้น

หากแอป Chat ต้องการเข้าถึงข้อมูลผู้ใช้หรือดำเนินการในนามของผู้ใช้ ให้ตรวจสอบสิทธิ์เป็นผู้ใช้แทน

หากคุณเป็นผู้ดูแลระบบโดเมน คุณสามารถให้การมอบสิทธิ์ทั่วทั้งโดเมนเพื่อให้สิทธิ์บัญชีบริการของแอปพลิเคชันในการเข้าถึงข้อมูลของผู้ใช้โดยไม่ต้องขอคำยินยอมจากผู้ใช้แต่ละคน หลังจากกำหนดค่าการมอบสิทธิ์ทั่วทั้งโดเมนแล้ว คุณจะเรียก API โดยใช้บัญชีบริการเพื่อแอบอ้างเป็นบัญชีผู้ใช้ได้ แม้ว่าจะใช้บัญชีบริการในการตรวจสอบสิทธิ์ แต่การมอบสิทธิ์ทั่วทั้งโดเมนจะแอบอ้างว่าเป็นผู้ใช้ ดังนั้นจึงได้รับการพิจารณาว่าเป็นการตรวจสอบสิทธิ์ผู้ใช้ ส่วนฟังก์ชันที่ต้องมีการตรวจสอบสิทธิ์ผู้ใช้ คุณสามารถใช้การมอบสิทธิ์ทั่วทั้งโดเมนได้

ดูข้อมูลเพิ่มเติมเกี่ยวกับกรณีที่แอป 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
    

Apps Script

ขั้นตอนที่ 1: สร้างบัญชีบริการในคอนโซล Google Cloud

สร้างบัญชีบริการที่แอป Chat ใช้ เพื่อเข้าถึง Google APIs

สร้างบัญชีบริการ

ทำตามขั้นตอนต่อไปนี้เพื่อสร้างบัญชีบริการ

คอนโซล Google Cloud

  1. ในคอนโซล Google Cloud ให้ไปที่เมนู > IAM และผู้ดูแลระบบ > บัญชีบริการ

    ไปที่บัญชีบริการ

  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 ให้ไปที่เมนู > IAM และผู้ดูแลระบบ > บัญชีบริการ

    ไปที่บัญชีบริการ

  2. เลือกบัญชีบริการ
  3. คลิกคีย์ > เพิ่มคีย์ > สร้างคีย์ใหม่
  4. เลือก JSON แล้วคลิกสร้าง

    ระบบจะสร้างคู่คีย์สาธารณะ/ส่วนตัวใหม่และดาวน์โหลดลงในเครื่องเป็นไฟล์ใหม่ บันทึกไฟล์ JSON ที่ดาวน์โหลดเป็น credentials.json ในไดเรกทอรีการทำงาน โดยไฟล์นี้จะเป็นสำเนาเพียงรายการเดียวของคีย์นี้ ดูข้อมูลเกี่ยวกับวิธีจัดเก็บคีย์อย่างปลอดภัยที่การจัดการคีย์ของบัญชีบริการ

  5. คลิกปิด

โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับบัญชีบริการที่หัวข้อบัญชีบริการในเอกสารประกอบ Google Cloud IAM

ขั้นตอนที่ 2: ติดตั้งไลบรารีของไคลเอ็นต์ Google และทรัพยากร Dependency อื่นๆ

ติดตั้งไลบรารีไคลเอ็นต์ของ Google และทรัพยากร Dependency อื่นๆ ที่จำเป็นสำหรับโปรเจ็กต์

Java

หากต้องการเพิ่มไลบรารีของไคลเอ็นต์ Google และทรัพยากร Dependency อื่นๆ ที่จำเป็นในโปรเจ็กต์ Maven ให้แก้ไขไฟล์ pom.xml ในไดเรกทอรีของโปรเจ็กต์และเพิ่มทรัพยากร Dependency ต่อไปนี้

<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"

Apps Script

ตัวอย่างนี้ใช้ไลบรารี OAuth2 สำหรับ Apps Script เพื่อสร้างโทเค็น JWT สำหรับการตรวจสอบสิทธิ์บัญชีบริการ วิธีเพิ่มไลบรารีลงในโปรเจ็กต์ Apps Script

  1. คลิกโปรแกรมตัดต่อ ทางด้านซ้าย
  2. ทางด้านซ้ายถัดจากห้องสมุด ให้คลิกเพิ่มห้องสมุด
  3. ป้อนรหัสสคริปต์ 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
  4. คลิกค้นหา แล้วคลิกเพิ่ม

ตัวอย่างนี้ใช้บริการ Chat ขั้นสูงเพื่อเรียกใช้ Google Chat API วิธีเปิดใช้บริการสำหรับโปรเจ็กต์ Apps Script มีดังนี้

  1. คลิกโปรแกรมตัดต่อ ทางด้านซ้าย
  2. ทางด้านซ้าย ถัดจากบริการ ให้คลิกเพิ่มบริการ
  3. เลือก Google Chat API
  4. ในเวอร์ชัน ให้เลือก v1
  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 ให้รวมทรัพยากร Dependency ในแพ็กเกจโปรเจ็กต์และเรียกใช้คลาสหลักของแอปพลิเคชัน ให้แก้ไขไฟล์ 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

Apps Script

  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 ด้วยเนื้อหาของไฟล์ 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

Apps Script

เปิดไฟล์ ChatAppAuth.gs ในเครื่องมือแก้ไข Apps Script แล้วคลิกเรียกใช้

สคริปต์จะส่งคำขอที่ผ่านการตรวจสอบสิทธิ์ไปยัง 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