Google Chat アプリとして認証する

このガイドでは、サービス アカウントを設定して使用し、Chat アプリに代わって Google Chat API にアクセスする方法について説明します。まず、サービス アカウントを作成する方法について説明します。次に、サービス アカウントを使用して Chat API で認証し、Chat スペースにメッセージを投稿するスクリプトを作成する方法を示します。

サービス アカウントで認証された場合、Chat スペースに関するデータを取得したり、Chat スペースでアクションを実行したりするには、Chat アプリにスペースのメンバーシップが必要です。たとえば、スペースのメンバーを一覧表示したり、スペースにメッセージを作成したりするには、Chat アプリ自体がスペースのメンバーである必要があります。唯一の例外は、Chat アプリがアプリ認証でスペースを作成するケースです。この場合、アプリがスペースを作成し、自動的にメンバーになります。

https://www.googleapis.com/auth/chat.app.* で始まる名前の認可スコープでアプリの認可をサポートする Google Chat API メソッドには、1 回限りの管理者の承認が必要です。https://www.googleapis.com/auth/chat.bot 認可スコープによるアプリの認可をサポートする Google Chat API メソッドでは、追加の承認は必要ありません。https://www.googleapis.com/auth/chat.app.* 認可スコープはデベロッパー プレビューで使用できます。

Chat アプリがユーザーデータにアクセスしたり、ユーザーに代わって操作を実行したりする必要がある場合は、代わりにユーザーとして認証します。ドメイン管理者は、ドメイン全体の権限委任を付与して、ユーザーごとに同意を求めることなく、Chat アプリのサービス アカウントがユーザーのデータにアクセスできるようにすることができます。詳細については、ドメイン全体の委任を使用して認証と承認を行うをご覧ください。

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
  • インタラクティブ機能が有効になっている Google Chat アプリ。HTTP サービスを使用してインタラクティブな Chat アプリを作成するには、こちらのクイックスタートを完了してください。
  • Chat アプリをスペースに追加します。Chat アプリを追加するには、 Google Chat アプリのインタラクティブ機能をテストするをご覧ください。

Python

Node.js

  • Node.js 14 以降
  • npm パッケージ管理ツール
  • 初期化された Node.js プロジェクト。新しいプロジェクトを初期化するには、新しいフォルダを作成してそのフォルダに移動し、コマンドライン インターフェースで次のコマンドを実行します。
    npm init
  • インタラクティブ機能が有効になっている Google Chat アプリ。HTTP サービスを使用してインタラクティブな Chat アプリを作成するには、こちらのクイックスタートを完了してください。
  • Chat アプリをスペースに追加します。Chat 用アプリを追加するには、 Google Chat アプリのインタラクティブ機能をテストするをご覧ください。

Apps Script

ステップ 1: Google Cloud コンソールでサービス アカウントを作成する

Chat アプリが Google API にアクセスするために使用できるサービス アカウントを作成します。

サービス アカウントを作成する

サービス アカウントを作成するには、次の操作を行います。

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 ドキュメントのサービス アカウントをご覧ください。

次に、このサービス アカウント用に Google Workspace Marketplace 対応の OAuth クライアントを作成します。

管理者の承認を得る

https://www.googleapis.com/auth/chat.app.* で始まる認可スコープ(デベロッパー プレビューの一部として利用可能)を使用するには、Chat アプリで 1 回限りの管理者の承認を得る必要があります。

https://www.googleapis.com/auth/chat.bot 承認スコープを使用するには、管理者の承認は必要ありません。

管理者の承認を得るには、Chat アプリのサービス アカウントを次の情報で準備する必要があります。

  • Google Workspace Marketplace 対応の OAuth クライアント。
  • Google Workspace Marketplace SDK でのアプリの構成。

Google Workspace Marketplace 対応の OAuth クライアントを作成する

Google Workspace Marketplace 対応の OAuth クライアントを作成するには、次の操作を行います。

  1. Google Cloud コンソールで、メニュー > [IAM と管理] > [サービス アカウント] に移動します。

    [サービス アカウント] に移動

  2. Chat アプリ用に作成したサービス アカウントをクリックします。

  3. [詳細設定] をクリックします。

  4. [Google Workspace Marketplace 対応の OAuth クライアントを作成] をクリックします。

  5. [続行] をクリックします。

Google Workspace Marketplace 対応の OAuth クライアントが作成されたことを示す確認メッセージが表示されます。

Google Workspace Marketplace SDK で Chat 用アプリを構成する

Google Workspace Marketplace SDK で Chat アプリを構成する手順は次のとおりです。

  1. Google Cloud コンソールで、Google Workspace Marketplace SDK を有効にします。

    Google Workspace Marketplace SDK を有効にする

  2. Google Cloud コンソールで、メニュー アイコン > [API とサービス] > [有効な API とサービス] > [Google Workspace Marketplace SDK] > [アプリの構成] に移動します。

    [アプリの構成] に移動

  3. [App Configuration] ページの設定を完了します。Chat アプリの構成方法は、対象ユーザーなどの要素によって異なります。アプリの構成ページを完成させる方法については、Google Workspace Marketplace SDK でアプリを構成するをご覧ください。このガイドでは、次の情報を入力します。

    1. [アプリの公開設定] で [非公開] を選択します。
    2. [インストール設定] で、[個別ユーザーと管理者のインストール] を選択します。
    3. [アプリの統合] で [チャットアプリ] を選択します。
    4. [OAuth スコープ] で、Chat アプリで使用する認証スコープをすべて入力します。

    5. [デベロッパー情報] で、デベロッパー名デベロッパーのウェブサイト URLデベロッパーのメールアドレスを入力します。

    6. [Save draft] をクリックします。

管理者の承認を得る

サービス アカウントが管理者の承認を受け取るように設定されたので、Chat アプリの承認を設定するの手順に沿って、承認を付与できる Google Workspace 管理者から承認を取得します。

ステップ 2: Google クライアント ライブラリとその他の依存関係をインストールする

Google クライアント ライブラリと、プロジェクトに必要なその他の依存関係をインストールします。

Java

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>

Python

Python 用の Google クライアント ライブラリをまだインストールしていない場合は、コマンドライン インターフェースで次のコマンドを実行します。

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

Node.js

Google クライアント ライブラリを Node.js プロジェクトに追加するには、プロジェクトのディレクトリに切り替え、コマンドライン インターフェースで次のコマンドを実行します。

npm install "@googleapis/chat"

Apps Script

このサンプルでは、OAuth2 for Apps Script ライブラリを使用して、サービス アカウント認証用の JWT トークンを生成します。ライブラリを Apps Script プロジェクトに追加するには:

  1. 左側の [エディタ] をクリックします。
  2. 左側の [ライブラリ] の横にある [ライブラリを追加] をクリックします。
  3. スクリプト ID 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF を入力します。
  4. [Look up] をクリックし、[Add] をクリックします。

このサンプルでは、高度なチャット サービスを使用して Google Chat API を呼び出します。Apps Script プロジェクトでサービスを有効にするには:

  1. 左側の [エディタ] をクリックします。
  2. 左側の [サービス] の横にある [サービスを追加] をクリックします。
  3. [Google Chat API] を選択します。
  4. [バージョン] で [v1] を選択します。
  5. [追加] をクリックします。

Google のクライアント ライブラリでサポートされている任意の言語を使用できます。

ステップ 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 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 をスペース名に置き換えます。スペースは、Chat API の spaces.list メソッドまたはスペースの 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>
    

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.
    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 をスペース名に置き換えます。スペース名は、Chat API の spaces.list メソッドまたはスペースの 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 をスペース名に置き換えます。スペース名は、Chat API の spaces.list メソッドまたはスペースの URL から取得できます。サービス アカウントの秘密鍵ファイルの名前が credentials.json であることを確認します。

Apps Script

  1. Apps Script エディタで appsscript.json ファイルを編集し、サービス アカウントの OAuth トークンを取得するための外部リクエストに必要な OAuth スコープを追加します。

      "oauthScopes": [
        "https://www.googleapis.com/auth/script.external_request"
      ]
    
  2. 次のコードを Apps Script プロジェクトの ChatAppAuth.gs という名前のファイルに保存します。

    // 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. コードで、CREDENTIALScredentials.json ファイルの内容に置き換えます。

  4. コードで、SPACE_NAME をスペース名に置き換えます。スペース名は、Chat API の spaces.list メソッドまたはスペースの 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

Apps Script エディタで ChatAppAuth.gs ファイルを開き、[実行] をクリックします。

スクリプトが認証済みリクエストを Chat API に送信します。この 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 スペースに追加します。

管理者は、このアクションに必要な 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 管理者が、https://www.googleapis.com/auth/chat.app.* という名前で始まる承認スコープを使用する Chat アプリに対して 1 回限りの承認をまだ付与していないことを意味します。

このエラーを解決するには:

  • Chat アプリに承認を付与するよう Google Workspace 管理者に依頼します。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 リファレンス ドキュメントをご覧ください。