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. En primer lugar, se explica cómo crear una cuenta de servicio. Luego, se muestra cómo escribir una secuencia de comandos que use la cuenta de servicio para autenticarse con la API de Chat y publicar un mensaje en un espacio de Chat.

Las apps de Chat pueden usar cuentas de servicio para la autenticación cuando se llama de forma asíncrona a la API de Google Chat, de modo que puedan hacer lo siguiente:

  • Enviar mensajes a Google Chat con spaces.messages.create para realizar las siguientes acciones:
    • Notifica a los usuarios cuando un trabajo en segundo plano de larga duración termine de ejecutarse.
    • Alerta a los usuarios que un servidor se desconectó.
    • Pedirle a una persona de atención al cliente que atienda un caso de cliente recién abierto.
  • Actualiza los mensajes enviados anteriormente con spaces.messages.update a lo siguiente:
    • Cambia el estado de una operación en curso.
    • Actualizar el destinatario o la fecha límite de una tarea
  • Crea una lista de los usuarios de un espacio con spaces.members.list para hacer lo siguiente:
    • 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, las apps de Chat deben tener membresías en el espacio para obtener datos sobre un espacio de Chat o realizar acciones en él. Por ejemplo, para mostrar una lista de los miembros de un espacio o crear un mensaje en él, la app de Chat debe ser miembro del espacio.

Si tu app de Chat necesita acceder a los datos del usuario o realizar acciones en nombre de un usuario, autentica la app como usuario.

Si eres administrador de dominio, puedes otorgar delegación de autoridad de todo el dominio para autorizar que la cuenta de servicio de una aplicación acceda a los datos de tus usuarios sin necesidad de que cada uno dé 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 suplantar la identidad de una cuenta de usuario. Aunque una cuenta de servicio se usa para la autenticación, la delegación de todo el dominio imita a un usuario y, por lo tanto, se considera autenticación de usuario. Para cualquier funcionalidad que requiera autenticación de usuario, puedes usar la delegación de todo el dominio.

Para obtener más información sobre 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 autenticación y autorización de la API de Chat.

Requisitos previos

Para ejecutar el ejemplo de esta guía, necesitas los siguientes requisitos previos:

Además, necesitas los siguientes requisitos previos específicos de cada lenguaje:

Java

  • JDK 1.7 o una versión posterior
  • La herramienta de administración de paquetes de Maven
  • Un proyecto de Maven inicializado. Para inicializar un proyecto nuevo, ejecuta el siguiente comando en tu interfaz 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
    

Python

  • Python 3.6 o superior
  • La herramienta de administración de paquetes pip

Node.js

  • Node.js
  • La herramienta de administración de paquetes npm
  • Un proyecto de Node.js inicializado. Para inicializar un proyecto nuevo, crea una carpeta nueva, cambia a ella y ejecuta el siguiente comando en la interfaz de línea de comandos:

    npm init
    

Apps Script

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

Crea una cuenta de servicio que tu app de Chat pueda usar para 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 administración > Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Haz 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 usuarios o grupos que puedan administrar y realizar acciones con esta cuenta de servicio. Para obtener más información, 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. A continuación, crea una clave privada 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 administración > 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.

    Se generará y descargará el nuevo par de claves pública/privada en tu equipo como un archivo nuevo. Guarda el archivo JSON descargado como credentials.json en tu directorio de trabajo. Este archivo es la única copia de esta clave. Para obtener más información sobre cómo almacenar tu clave de forma segura, consulta Cómo administrar claves para 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 necesarias a tu proyecto de Maven, edita el archivo pom.xml en el directorio de tu proyecto y agrega 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 al directorio del proyecto y ejecuta el siguiente comando en la interfaz de línea de comandos:

npm install "@googleapis/chat"

Apps Script

En esta muestra, se usa la biblioteca OAuth2 para Apps Script a fin de generar un token JWT para la autenticación de cuentas de servicio. Para agregar la biblioteca a tu proyecto de Apps Script, sigue estos pasos:

  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 secuencia de comandos 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF.
  4. Haz clic en Buscar y, luego, en Agregar.

En esta muestra, se usa el servicio de Chat avanzado para llamar a la API de Google Chat. Para activar el servicio en tu proyecto de Apps Script, haz lo siguiente:

  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 lenguaje compatible con nuestras bibliotecas cliente.

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

Con el siguiente código, se autentica con la API de Chat mediante una cuenta de servicio y, luego, se 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 nombre de espacio, que puedes obtener del método spaces.list en la API de Chat o desde la URL de un espacio.

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

  5. Asegúrate de que el archivo de claves privadas de la cuenta de servicio se llame credentials.json y cópialo en el subdirectorio resources.

  6. Si deseas configurar Maven para que incluya el archivo de claves privadas en el paquete del proyecto, edita el archivo pom.xml en el directorio de tu proyecto y agrega la siguiente configuración a la sección <build>:

    <build>
      <!-- ... existing configurations ... -->
      <resources>
        <resource>
          <directory>resources</directory>
        </resource>
      </resources>
    </build>
    
  7. Si deseas configurar Maven para que incluya las dependencias en el paquete del proyecto y ejecute la clase principal de tu aplicación, edita el archivo pom.xml en el directorio de tu proyecto y agrega la siguiente configuración a la 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 nombre de espacio, que puedes obtener del método spaces.list en la API de Chat o desde la URL de un espacio. Asegúrate de que el archivo de claves privadas de la cuenta de servicio se llame 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 nombre de espacio, que puedes obtener del método spaces.list en la API de Chat o desde la URL de un espacio. Asegúrate de que el archivo de claves privadas de la cuenta de servicio se llame credentials.json.

Apps Script

  1. En el editor de Apps Script, edita el archivo appsscript.json y agrega el permiso de OAuth necesario para realizar solicitudes externas a fin 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 nombre de espacio, que puedes obtener del método spaces.list en la API de Chat o desde la URL de un espacio.

Paso 4: Ejecuta el ejemplo completo

En el 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 realiza una solicitud autenticada a la API de Chat, que responde con la publicación de un mensaje en un espacio de Chat como una app de Chat.

Soluciona problemas con el ejemplo

En esta sección, se describen algunos problemas habituales que puedes encontrar mientras intentas ejecutar esta muestra.

No tienes permiso para usar esta app

Cuando ejecutes la secuencia de comandos, es posible que recibas un mensaje de error que diga lo siguiente:

<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 el espacio de Chat especificado.

Para resolver el error, agrega la app de Chat al espacio de Chat especificado en la secuencia de comandos.

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