Autentícate como app de Google Chat

En esta guía, se explica cómo configurar y usar una cuenta de servicio para acceder a la API de Google Chat en nombre de una app de Chat. Primero, se explica cómo crear una cuenta de servicio. Luego, demuestra cómo escribir una secuencia de comandos que use la cuenta de servicio para autenticarse con el chat API y publicar un mensaje en un espacio de Chat.

Las apps de Chat pueden usar cuentas de servicio para autenticarse cuando realizan llamadas de forma asíncrona la API de Google Chat para que puedan hacer lo siguiente:

  • Envía mensajes a Google Chat con spaces.messages.create a:
    • Notifica a los usuarios cuando una tarea en segundo plano de larga duración termina de ejecutarse.
    • Informa a los usuarios que un servidor se desconectó.
    • Pídele a un representante de atención al cliente que atienda un caso de cliente recién abierto.
  • Actualizar mensajes enviados anteriormente con spaces.messages.update a:
    • Cambia el estado de una operación en curso.
    • Actualiza el destinatario o la fecha límite de una tarea.
  • Obtén una lista de los usuarios de un espacio con spaces.members.list para:
    • Mira quién está en un espacio.
    • Verifica que la membresía del espacio incluya a todos los miembros de un equipo.

Cuando se autentica con una cuenta de servicio, para obtener datos sobre los datos o realizar acciones En un espacio de Chat, las apps de Chat deben ser miembros de ese espacio. Por ejemplo, para para ver los miembros de un espacio o crear un mensaje en un espacio, la app de Chat debe ser miembro del espacio.

Si tu app de Chat necesita acceder a datos del usuario o realizar acciones autenticarte como usuario.

Si eres un administrador de dominio, puedes otorgar delegación de autoridad de todo el dominio para autorizar que una cuenta de servicio de una aplicación acceda a las contraseñas datos sin por lo que cada usuario deberá dar su consentimiento. Después de configurar la delegación de todo el dominio, puedes Realizar llamadas a la API con tu cuenta de servicio para usar la identidad de una cuenta de usuario Aunque las cuentas de servicio se usan para autenticación, la delegación de todo el dominio se hace pasar por un usuario y, por lo tanto, se se considera autenticación de usuarios. Cualquier funcionalidad que requiera el uso autenticación, puedes usar la delegación de todo el dominio.

Para saber cuándo las apps de Chat requieren autenticación y qué tipo de autenticación usar, consulta Tipos de autenticación obligatoria en la descripción general de la autenticación y la autorización de la API de Chat.

Requisitos previos

Java

  • JDK 1.7 o superior
  • La herramienta de administración de paquetes Maven
  • Un proyecto de Maven inicializado. Para inicializar un proyecto nuevo, ejecuta el siguiente comando en tu de línea de comandos:
    mvn archetype:generate -DgroupId=com.google.chat.app.authsample -DartifactId=auth-sample-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    
  • Una app de Google Chat habilitada para funciones interactivas. Para crear un app de Chat interactiva con un servicio HTTP, completa esta guía de inicio rápido.
  • Agregar la app de Chat a un espacio Para agregar App de Chat, consulta Prueba las funciones interactivas de las apps de Google Chat.

Python

Node.js

Apps Script

Paso 1: Crea una cuenta de servicio en la consola de Google Cloud

Crea una cuenta de servicio que la app de Chat pueda usar para lo siguiente: acceder a las APIs de Google.

Crea una cuenta de servicio

Para crear una cuenta de servicio, sigue estos pasos:

Consola de Google Cloud

  1. En la consola de Google Cloud, ve a Menú > IAM y Administrador > Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Haga clic en Crear cuenta de servicio.
  3. Completa los detalles de la cuenta de servicio y, luego, haz clic en Crear y continuar.
  4. Opcional: Asigna roles a tu cuenta de servicio para otorgar acceso a los recursos de tu proyecto de Google Cloud. Para obtener más detalles, consulta Cómo otorgar, cambiar y revocar el acceso a los recursos.
  5. Haz clic en Continuar.
  6. Opcional: Ingresa los usuarios o grupos que puedan administrar y realizar acciones con esta cuenta de servicio. Para obtener más detalles, consulta Administra la suplantación de cuentas de servicio.
  7. Haz clic en Listo. Toma nota de la dirección de correo electrónico de la cuenta de servicio.

gcloud CLI

  1. Crea la cuenta de servicio:
    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name="SERVICE_ACCOUNT_NAME"
  2. Opcional: Asigna roles a tu cuenta de servicio para otorgar acceso a los recursos de tu proyecto de Google Cloud. Para obtener más detalles, consulta Cómo otorgar, cambiar y revocar el acceso a los recursos.

La cuenta de servicio aparece en la página de la cuenta de servicio. Luego, crea una carpeta privada de servicio para la cuenta de servicio.

Crea una clave privada

Si deseas crear y descargar una clave privada para la cuenta de servicio, sigue estos pasos:

  1. En la consola de Google Cloud, ve a Menú > IAM y Administrador > Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona tu cuenta de servicio.
  3. Haz clic en Claves > Agregar clave > Crear clave nueva.
  4. Selecciona JSON y, luego, haz clic en Crear.

    Ya se generó y descargó el nuevo par de claves pública/privada en tu máquina como un archivo nuevo. Guarda el archivo JSON descargado como credentials.json en tu de trabajo actual. Este archivo es la única copia de la clave. Para obtener información sobre cómo almacenar tu clave de forma segura, consulta Administra claves de cuentas de servicio.

  5. Haz clic en Cerrar.

Para obtener más información sobre las cuentas de servicio, consulta cuentas de servicio en la documentación de Google Cloud IAM.

Paso 2: Instala la biblioteca cliente de Google y otras dependencias

Instala la biblioteca cliente de Google y otras dependencias necesarias para el proyecto.

Java

Para agregar las bibliotecas cliente de Google y otras dependencias requeridas a tu Para tu proyecto de Maven, edita el archivo pom.xml en el directorio de tu proyecto y agrega el archivo las siguientes dependencias:

<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

Si aún no instalaste las bibliotecas cliente de Google para Python, ejecuta el siguiente comando en tu interfaz de línea de comandos:

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

Node.js

Para agregar las bibliotecas cliente de Google a tu proyecto de Node.js, cambia a tu del proyecto y ejecuta el siguiente comando en tu interfaz de línea de comandos:

npm install "@googleapis/chat"

Apps Script

En este ejemplo, se usan OAuth2 para la biblioteca de Apps Script para generar un token JWT para la autenticación de la cuenta de servicio. Cómo agregar la biblioteca a tu proyecto de Apps Script:

  1. A la izquierda, haz clic en Editor .
  2. A la izquierda, junto a Bibliotecas, haz clic en Agregar una biblioteca.
  3. Ingresa el ID de la secuencia de comandos 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF.
  4. Haz clic en Buscar y, luego, en Agregar.

En este ejemplo, se usan Servicio de chat avanzado llamar a la API de Google Chat. Para activar el servicio en tu Proyecto de Apps Script:

  1. A la izquierda, haz clic en Editor .
  2. A la izquierda, junto a Servicios, haz clic en Agregar un servicio.
  3. Selecciona API de Google Chat.
  4. En Versión, selecciona v1.
  5. Haz clic en Agregar.

Puedes usar cualquier idioma que admita nuestra bibliotecas cliente.

Paso 3: Escribe una secuencia de comandos que use la cuenta de servicio para autenticarse con la API de Chat

El siguiente código se autentica con el API de Chat con una cuenta de servicio y, luego, publica un mensaje en un espacio de Chat:

Java

  1. En el directorio de tu proyecto, abre el archivo. src/main/java/com/google/chat/app/authsample/App.java
  2. Reemplaza el contenido de App.java con el siguiente código:

    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. En el código, reemplaza SPACE_NAME por un espacio. que puedes obtener de spaces.list en la API de Chat o desde la URL de un espacio.

  4. Crea un nuevo subdirectorio llamado resources dentro del directorio de tu proyecto.

  5. Asegúrate de que el archivo de claves privadas de tu cuenta de servicio tenga el nombre credentials.json y cópialo en el subdirectorio resources.

  6. Para configurar Maven a fin de que incluya el archivo de claves privadas en el paquete del proyecto, sigue estos pasos: Edita el archivo pom.xml en el directorio de tu proyecto y agrega lo siguiente: de Terraform en la sección <build>:

    <build>
      <!-- ... existing configurations ... -->
      <resources>
        <resource>
          <directory>resources</directory>
        </resource>
      </resources>
    </build>
    
  7. Para configurar Maven de modo que incluya las dependencias en el paquete del proyecto y Para ejecutar la clase principal de tu aplicación, edita el archivo pom.xml en tu directorio del proyecto y agrega la siguiente configuración al Sección <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. En el directorio de trabajo, crea un archivo llamado chat_app_auth.py.
  2. Incluye el siguiente código en 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. En el código, reemplaza SPACE_NAME por un espacio. que puedes obtener de spaces.list en la API de Chat o desde la URL de un espacio. Asegúrate de que la archivo de claves privadas para tu cuenta de servicio se llama credentials.json.

Node.js

  1. En el directorio de tu proyecto, crea un archivo llamado chat_app_auth.js.
  2. Incluye el siguiente código en 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. En el código, reemplaza SPACE_NAME por un espacio. que puedes obtener de spaces.list en la API de Chat o desde la URL de un espacio. Asegúrate de que la archivo de claves privadas para tu cuenta de servicio se llama credentials.json.

Apps Script

  1. En el editor de Apps Script, edita el archivo appsscript.json y agregar el permiso de OAuth necesario para hacer solicitudes externas con el objetivo de obtener el token de OAuth de la cuenta de servicio:

      "oauthScopes": [
        "https://www.googleapis.com/auth/script.external_request"
      ]
    
  2. Guarda el siguiente código en un archivo llamado ChatAppAuth.gs en tu proyecto de 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. En el código, reemplaza CREDENTIALS por el contenido del archivo credentials.json.

  4. En el código, reemplaza SPACE_NAME por un espacio. que puedes obtener de spaces.list en la API de Chat o desde la URL de un espacio.

Paso 4: Ejecuta el ejemplo completo

En tu directorio de trabajo, compila y ejecuta la muestra:

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

Abre el archivo ChatAppAuth.gs en el editor de Apps Script y Haz clic en Ejecutar.

Tu secuencia de comandos envía una solicitud autenticada al API de Chat, que responde publicando un mensaje en un espacio de Chat como una app de Chat.

Soluciona problemas del ejemplo

En esta sección, se describen algunos problemas habituales que puedes encontrar al intentar para ejecutar esta muestra.

No tienes permiso para usar esta app

Cuando ejecutas la secuencia de comandos, es posible que recibas el siguiente error:

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

Este mensaje de error significa que la app de Chat no tiene permiso para crear mensajes de Chat en la Espacio de Chat

Para resolverlo, agrega la app de Chat al espacio de Chat especificadas en la secuencia de comandos.

Revisa la API de Chat para descubrir qué más puede hacer la API de Chat documentación de referencia.