Аутентификация в приложении Google Chat

В этом руководстве объясняется, как настроить и использовать учётную запись службы для доступа к API Google Chat из приложения Chat. Сначала вы узнаете, как создать учётную запись службы. Затем будет показано, как написать скрипт, который использует учётную запись службы для аутентификации в API Chat и публикации сообщения в чат-группе.

При аутентификации с помощью учётной записи сервиса для получения данных о пространстве чата или выполнения действий в нём приложения чата должны быть участниками этого пространства. Например, чтобы составить список участников пространства или создать сообщение в нём, приложение чата само должно быть его участником. Исключением является случай, когда приложение чата создаёт пространство с аутентификацией приложения. В этом случае приложение создаёт пространство и автоматически становится его участником.

Методы API Google Chat, поддерживающие авторизацию приложений с областями авторизации, имена которых начинаются https://www.googleapis.com/auth/chat.app.* , требуют однократного одобрения администратора . Методы API Google Chat, поддерживающие авторизацию приложений с областью авторизации https://www.googleapis.com/auth/chat.bot не требуют дополнительного одобрения.

Если вашему приложению Chat требуется доступ к данным пользователя или выполнение действий от его имени, пройдите аутентификацию как пользователь . Если вы являетесь администратором домена, вы можете предоставить общедоменное делегирование полномочий, чтобы разрешить учётной записи службы приложения Chat доступ к данным вашего пользователя без необходимости получения согласия каждого пользователя. Подробнее см. в статье «Аутентификация и авторизация с использованием общедоменного делегирования» .

Дополнительную информацию о том, когда приложениям Chat требуется аутентификация и какой тип аутентификации следует использовать, см. в разделе Типы требуемой аутентификации в обзоре аутентификации и авторизации API Chat.

Предпосылки

Ява

  • 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
  • Приложение Google Chat, которое получает и реагирует на события взаимодействия . Чтобы создать интерактивное приложение Chat с использованием HTTP-сервиса, выполните это краткое руководство .
  • Добавьте приложение Chat в чат-группу. Чтобы добавить приложение Chat, см. статью Тестирование интерактивных функций для приложений Google Chat .

Питон

Node.js

Скрипт приложений

Шаг 1: Создайте учетную запись службы в консоли Google Cloud

Создайте учетную запись службы, которую ваше приложение чата сможет использовать для доступа к API Google.

Создать учетную запись службы

Чтобы создать учетную запись службы, выполните следующие действия:

Консоль 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.

Затем создайте для этой учетной записи службы клиент OAuth, совместимый с Google Workspace Marketplace.

Получите одобрение администратора

Для использования области авторизации https://www.googleapis.com/auth/chat.bot одобрение администратора не требуется. Перейдите к шагу 2: Установка клиентской библиотеки Google и других зависимостей . В примере в этом руководстве используется область авторизации https://www.googleapis.com/auth/chat.bot , поэтому, если вы следуете примеру, перейдите к шагу 2.

Чтобы использовать область авторизации, начинающуюся с https://www.googleapis.com/auth/chat.app.* , ваше приложение Chat должно получить однократное одобрение администратора .

Чтобы получить одобрение администратора, вам необходимо подготовить учетную запись службы приложения Chat, указав следующую информацию:

  • Клиент OAuth, совместимый с Google Workspace Marketplace.
  • Конфигурация приложения в Google Workspace Marketplace SDK.

Создайте клиент OAuth, совместимый с Google Workspace Marketplace

Чтобы создать клиент OAuth, совместимый с Google Workspace Marketplace, выполните следующие действия:

  1. В консоли Google Cloud перейдите в > IAM и администрирование > Учетные записи служб .

    Перейти к учетным записям служб

  2. Щелкните учетную запись службы, которую вы создали для своего приложения Chat.

  3. Нажмите Дополнительные настройки .

  4. Нажмите «Создать клиент OAuth, совместимый с Google Workspace Marketplace» .

  5. Нажмите «Продолжить» .

Появится подтверждающее сообщение о том, что создан клиент OAuth, совместимый с Google Workspace Marketplace.

Настройте приложение чата в Google Workspace Marketplace SDK

Чтобы настроить приложение Chat в Google Workspace Marketplace SDK, выполните следующие действия:

  1. В консоли Google Cloud включите Google Workspace Marketplace SDK.

    Включить Google Workspace Marketplace SDK

  2. В консоли Google Cloud перейдите > API и службы > Включенные API и службы > Google Workspace Marketplace SDK > Конфигурация приложения .

    Перейти к конфигурации приложения

  3. Заполните страницу конфигурации приложения. Настройка приложения Chat зависит от вашей целевой аудитории и других факторов. За информацией о заполнении страницы конфигурации приложения обратитесь к разделу «Настройка приложения в Google Workspace Marketplace SDK» . Для целей данного руководства введите следующую информацию:

    1. В разделе Видимость приложения выберите Частное .
    2. В разделе «Параметры установки» выберите «Индивидуальная установка + установка администратора» .
    3. В разделе Интеграция приложений выберите Приложение чата .
    4. В разделе OAuth scopes введите все области аутентификации, которые использует ваше приложение Chat.

    5. В разделе «Информация о разработчике» введите имя разработчика , URL-адрес веб-сайта разработчика и адрес электронной почты разработчика .

    6. Нажмите Сохранить черновик .

Получите одобрение администратора

Теперь, когда ваша учетная запись службы настроена на получение одобрения администратора, получите его у администратора Google Workspace, который может предоставить одобрение, выполнив шаги, описанные в разделе Настройка авторизации для приложений чата .

Шаг 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 для Python, выполните следующую команду в интерфейсе командной строки:

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. Нажмите «Поиск» , затем нажмите « Добавить» .

В этом примере используется служба Advanced Chat для вызова API Google Chat. Чтобы включить службу для вашего проекта Apps Script:

  1. Слева нажмите Редактор .
  2. Слева, рядом с пунктом Услуги , нажмите услугу .
  3. Выберите API чата Google .
  4. В поле Версия выберите v1 .
  5. Нажмите «Добавить» .

Вы можете использовать любой язык, поддерживаемый нашими клиентскими библиотеками .

Шаг 3: Напишите скрипт, который использует учетную запись службы для аутентификации с помощью Chat API.

Следующий код выполняет аутентификацию в 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 using 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. creds = 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=creds)  # 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 using 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: Запустите полный пример

В вашем рабочем каталоге соберите и запустите пример:

Ява

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 в редакторе скриптов приложений и нажмите «Выполнить» .

Ваш скрипт отправляет аутентифицированный запрос к 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"> 

Это сообщение об ошибке означает, что у приложения чата нет разрешения на создание сообщений чата в указанном пространстве чата.

Чтобы устранить ошибку, добавьте приложение чата в пространство чата, указанное в скрипте.

Администратор должен предоставить приложению требуемую область авторизации OAuth для этого действия.

При запуске скрипта может возникнуть следующая ошибка:

<HttpError 403 when requesting https://chat.googleapis.com/v1/spaces/{space}?alt=json returned "The administrator must grant the app the required OAuth authorization scope for this action.". Details: "The administrator must grant the app the required OAuth authorization scope for this action."> 

Это сообщение об ошибке означает, что администратор Google Workspace еще не предоставил однократное разрешение приложению Chat на использование областей авторизации, начинающихся с имени https://www.googleapis.com/auth/chat.app.* .

Чтобы устранить ошибку:

  • Попросите администратора Google Workspace предоставить одобрение вашему приложению Chat . При обработке этой ошибки в логике приложения Chat рассмотрите возможность отправки сообщения о том, что приложению Chat требуется одобрение администратора для выполнения запрошенного действия, например: To perform this action, I need approval. <https://support.google.com/a?p=chat-app-auth|Learn more>.
  • Если метод Google Chat API поддерживает область авторизации https://www.googleapis.com/auth/chat.bot , которая не требует одобрения администратора, рассмотрите возможность использования этого метода. Чтобы узнать, какие области авторизации поддерживает метод, см. справочную документацию Google Chat API .