คู่มือนี้อธิบายวิธีตั้งค่าและใช้บัญชีบริการเพื่อเข้าถึง 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
ข้อกำหนดเบื้องต้น
ในการเรียกใช้ตัวอย่างในคู่มือนี้ คุณต้องมีข้อกําหนดเบื้องต้นต่อไปนี้
- บัญชี Google Workspace ที่มีสิทธิ์เข้าถึง Google Chat
- โปรเจ็กต์ Google Cloud ที่เปิดใช้ Chat API หากต้องการสร้างโปรเจ็กต์และเปิดใช้ API โปรดดูสร้างโปรเจ็กต์และเปิดใช้ API
- แอป Chat ที่เผยแพร่แล้วพร้อมการเป็นสมาชิกในพื้นที่ใน Chat
- หากต้องการสร้างและเผยแพร่แอป Chat โปรดดูหัวข้อสร้างแอป Google Chat ด้วย Cloud Functions
- หากต้องการเพิ่มแอป Chat ไปยังพื้นที่ใน Chat โปรดดูหัวข้อเพิ่มแอปไปยังพื้นที่ทำงานหรือการสนทนาใน Google Chat
นอกจากนี้ คุณต้องมีข้อกำหนดเบื้องต้นสำหรับภาษานั้นๆ ด้วย
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
Apps Script
- โปรเจ็กต์ Apps Script ที่เชื่อมต่อกับโปรเจ็กต์ Google Cloud ของคุณ หากต้องการเริ่มต้นโปรเจ็กต์ Apps Script โปรดดูการเริ่มต้นใช้งานแอป Google Apps Script Chat อย่างรวดเร็ว
ขั้นตอนที่ 1: สร้างบัญชีบริการในคอนโซล Google Cloud
สร้างบัญชีบริการที่แอป Chat ของคุณสามารถใช้ เพื่อเข้าถึง Google APIs
สร้างบัญชีบริการ
หากต้องการสร้างบัญชีบริการ ให้ทำตามขั้นตอนต่อไปนี้
คอนโซล Google Cloud
- ในคอนโซล Google Cloud ให้ไปที่เมนู > IAM และผู้ดูแลระบบ > บัญชีบริการ
- คลิกสร้างบัญชีบริการ
- กรอกรายละเอียดบัญชีบริการ แล้วคลิกสร้างและดำเนินการต่อ
- ไม่บังคับ: มอบหมายบทบาทให้บัญชีบริการเพื่อให้สิทธิ์เข้าถึงทรัพยากรของโปรเจ็กต์ Google Cloud โปรดดูรายละเอียดเพิ่มเติมที่การให้ เปลี่ยนแปลง และเพิกถอนสิทธิ์เข้าถึงทรัพยากร
- คลิกต่อไป
- ไม่บังคับ: ป้อนผู้ใช้หรือกลุ่มที่จัดการและดำเนินการต่างๆ ด้วยบัญชีบริการนี้ได้ โปรดดูรายละเอียดเพิ่มเติมที่การจัดการการแอบอ้างเป็นบัญชีบริการ
- คลิกเสร็จ จดอีเมลสำหรับบัญชีบริการ
gcloud CLI
- สร้างบัญชีบริการ:
gcloud iam service-accounts create
SERVICE_ACCOUNT_NAME
\ --display-name="SERVICE_ACCOUNT_NAME
" - ไม่บังคับ: มอบหมายบทบาทให้บัญชีบริการเพื่อให้สิทธิ์เข้าถึงทรัพยากรของโปรเจ็กต์ Google Cloud โปรดดูรายละเอียดเพิ่มเติมที่การให้ เปลี่ยนแปลง และเพิกถอนสิทธิ์เข้าถึงทรัพยากร
บัญชีบริการจะปรากฏในหน้าบัญชีบริการ ต่อไป ให้สร้างคีย์ส่วนตัว สำหรับบัญชีบริการ
สร้างคีย์ส่วนตัว
หากต้องการสร้างและดาวน์โหลดคีย์ส่วนตัวสำหรับบัญชีบริการ ให้ทำตามขั้นตอนต่อไปนี้
- ในคอนโซล Google Cloud ให้ไปที่เมนู > IAM และผู้ดูแลระบบ > บัญชีบริการ
- เลือกบัญชีบริการ
- คลิกคีย์ > เพิ่มคีย์ > สร้างคีย์ใหม่
- เลือก JSON แล้วคลิกสร้าง
ระบบจะสร้างคู่คีย์สาธารณะ/ส่วนตัวใหม่และดาวน์โหลดลงในเครื่องของคุณเป็นไฟล์ใหม่ บันทึกไฟล์ JSON ที่ดาวน์โหลดเป็น
credentials.json
ในไดเรกทอรีการทำงาน ไฟล์นี้เป็นเพียงสำเนาเดียวของคีย์นี้ ดูข้อมูลเกี่ยวกับวิธีจัดเก็บคีย์อย่างปลอดภัยที่การจัดการคีย์ของบัญชีบริการ - คลิกปิด
ดูข้อมูลเพิ่มเติมเกี่ยวกับบัญชีบริการได้ที่บัญชีบริการในเอกสารประกอบเกี่ยวกับ Google Cloud IAM
ขั้นตอนที่ 2: ติดตั้งไลบรารีของไคลเอ็นต์ Google และทรัพยากร Dependency อื่นๆ
ติดตั้งไลบรารีไคลเอ็นต์ของ Google และทรัพยากร Dependency อื่นๆ ที่จำเป็นสำหรับโปรเจ็กต์นี้
Java
หากต้องการเพิ่มไลบรารีไคลเอ็นต์ของ Google และการอ้างอิงอื่นๆ ที่จำเป็นในโปรเจ็กต์ 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
- คลิกตัดต่อวิดีโอ ทางด้านซ้าย
- ทางด้านซ้าย ถัดจากห้องสมุด ให้คลิกเพิ่มห้องสมุด
- ป้อนรหัสสคริปต์
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
- คลิกค้นหา แล้วคลิกเพิ่ม
ตัวอย่างนี้ใช้บริการ Chat ขั้นสูงเพื่อเรียกใช้ Google Chat API วิธีเปิดใช้บริการสำหรับโปรเจ็กต์ Apps Script มีดังนี้
- คลิกตัดต่อวิดีโอ ทางด้านซ้าย
- ที่ด้านซ้ายถัดจากบริการ ให้คลิกเพิ่มบริการ
- เลือก Google Chat API
- ในเวอร์ชัน ให้เลือก v1
- คลิกเพิ่ม
คุณสามารถใช้ภาษาใดก็ได้ที่ไลบรารีของไคลเอ็นต์รองรับ
ขั้นตอนที่ 3: เขียนสคริปต์ที่ใช้บัญชีบริการเพื่อตรวจสอบสิทธิ์กับ Chat API
รหัสต่อไปนี้จะตรวจสอบสิทธิ์กับ Chat API โดยใช้บัญชีบริการ แล้วโพสต์ข้อความไปยังพื้นที่ใน Chat
Java
- ในไดเรกทอรีของโปรเจ็กต์ ให้เปิดไฟล์
src/main/java/com/google/chat/app/authsample/App.java
แทนที่เนื้อหาใน
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(); } }
ในโค้ด ให้แทนที่
SPACE_NAME
ด้วยชื่อพื้นที่ทำงาน ซึ่งดูได้จากเมธอดspaces.list
ใน Chat API หรือจาก URL ของพื้นที่ทำงานสร้างไดเรกทอรีย่อยใหม่ชื่อ
resources
ภายในไดเรกทอรีของโปรเจ็กต์ตรวจสอบว่าไฟล์คีย์ส่วนตัวสำหรับบัญชีบริการมีชื่อว่า
credentials.json
และคัดลอกไปยังไดเรกทอรีย่อยresources
หากต้องการกำหนดค่า Maven ให้รวมไฟล์คีย์ส่วนตัวในแพ็กเกจโปรเจ็กต์ ให้แก้ไขไฟล์
pom.xml
ในไดเรกทอรีของโปรเจ็กต์และเพิ่มการกำหนดค่าต่อไปนี้ในส่วน<build>
<build> <!-- ... existing configurations ... --> <resources> <resource> <directory>resources</directory> </resource> </resources> </build>
หากต้องการกำหนดค่า 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
- สร้างไฟล์ชื่อ
chat_app_auth.py
ในไดเรกทอรีการทำงาน รวมรหัสต่อไปนี้ใน
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)
ในโค้ด ให้แทนที่
SPACE_NAME
ด้วยชื่อพื้นที่ทำงาน ซึ่งดูได้จากเมธอดspaces.list
ใน Chat API หรือจาก URL ของพื้นที่ทำงาน ตรวจสอบว่าไฟล์คีย์ส่วนตัวสำหรับบัญชีบริการมีชื่อว่าcredentials.json
Node.js
- ในไดเรกทอรีของโปรเจ็กต์ ให้สร้างไฟล์ชื่อ
chat_app_auth.js
รวมรหัสต่อไปนี้ใน
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);
ในโค้ด ให้แทนที่
SPACE_NAME
ด้วยชื่อพื้นที่ทำงาน ซึ่งดูได้จากเมธอดspaces.list
ใน Chat API หรือจาก URL ของพื้นที่ทำงาน ตรวจสอบว่าไฟล์คีย์ส่วนตัวสำหรับบัญชีบริการมีชื่อว่าcredentials.json
Apps Script
ในเครื่องมือแก้ไข Apps Script ให้แก้ไขไฟล์
appsscript.json
และเพิ่มขอบเขต OAuth ที่จำเป็นในการส่งคำขอภายนอกเพื่อรับโทเค็น OAuth ของบัญชีบริการ ดังนี้"oauthScopes": [ "https://www.googleapis.com/auth/script.external_request" ]
บันทึกรหัสต่อไปนี้ในไฟล์ชื่อ
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()); }
ในโค้ด ให้แทนที่
CREDENTIALS
ด้วยเนื้อหาของไฟล์credentials.json
ในโค้ด ให้แทนที่
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