サービス アカウントを使用して Apps Script プロジェクトとして認証する

このガイドでは、Apps Script で API を呼び出すときにサービス アカウントで認証する方法について説明します。

サービス アカウントは、ユーザーではなく、アプリケーションで使用される特別な種類のアカウントです。サービス アカウントを使用すると、ロボット アカウントでデータにアクセスしたり、アクションを実行したり、Google Workspace または Cloud Identity ユーザーに代わってデータにアクセスしたりできます。詳細については、サービス アカウントについてをご覧ください。

Google Workspace API の認証の概要については、アクセス認証情報を作成するをご覧ください。

Apps Script でサービス アカウントを使用する場合

ScriptApp.getOAuthToken() などの他の認証方法ではなく、サービス アカウント認証の使用を検討する理由をいくつか紹介します。

  • Google Cloud APIs とサービスによるパフォーマンスの向上: 多くの Google Cloud APIs は、サービス アカウント認証用に設計されています。サービス アカウントは、ほとんどの API とのやり取りをより統合された信頼性の高い安全な方法で提供することもできます。
  • 分離された権限: サービス アカウントには、ユーザーとは別の独自の権限があります。Apps Script プロジェクトを他のユーザーと共有すると、認証方法 ScriptApp.getOAuthToken() が失敗することがあります。サービス アカウントを使用すると、スクリプトを共有して Google Workspace アドオンとして公開できます。
  • 自動化されたスクリプトと長時間実行タスク: サービス アカウントを使用すると、ユーザー入力なしで自動化されたスクリプト、バッチプロセス、バックグラウンド タスクを実行できます。
  • セキュリティの強化と最小権限の原則: サービス アカウントに特定の権限を付与し、必要なリソースにのみアクセスできるようにします。これは、セキュリティ リスクを軽減する最小権限の原則に従っています。ScriptApp.getOAuthToken() を使用すると、スクリプトにすべてのユーザー権限が付与されることが多く、権限の範囲が広すぎる可能性があります。
  • 一元化されたアクセス管理: サービス アカウントは、Google Cloud の Identity and Access Management(IAM)を使用して管理されます。IAM を使用すると、Google Workspace 組織は Apps Script プロジェクト内の認証済みサービスへのアクセスを管理できます。

前提条件

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

Cloud プロジェクトで、サービス アカウントを作成します。

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 管理コンソールで、メニュー アイコン > [アカウント] > [管理者ロール] に移動します。

    管理者ロールに移動する

  2. 割り当てるロールにカーソルを合わせ、[管理者を割り当て] をクリックします。

  3. [サービス アカウントへの割り当て] をクリックします。

  4. サービス アカウントのメールアドレスを入力します。

  5. [追加> ロールを割り当てる] をクリックします。

サービス アカウントの認証情報を作成する

公開鍵/秘密鍵のペアの形式で認証情報を取得する必要があります。これらの認証情報は、アプリ内のサービス アカウントのアクションを承認するためにコードで使用されます。

サービス アカウントの認証情報を取得するには:

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

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

  2. サービス アカウントを選択します。
  3. [] > [鍵を追加] > [新しい鍵を作成] をクリックします。
  4. [JSON] を選択し、[作成] をクリックします。

    新しい公開鍵と秘密鍵のペアが生成され、新しいファイルとしてパソコンにダウンロードされます。ダウンロードした JSON ファイルを作業ディレクトリに credentials.json として保存します。このファイルはこの鍵の唯一のコピーです。キーを安全に保存する方法については、サービス アカウント キーの管理をご覧ください。

  5. [閉じる] をクリックします。

Cloud プロジェクト番号をコピーする

  1. Google Cloud コンソールで、メニュー アイコン > [IAM と管理] > [設定] に移動します。

    [IAM と管理] の [設定] に移動

  2. [プロジェクト番号] フィールドで、値をコピーします。

Apps Script プロジェクトでサービス アカウント認証を設定する

このセクションでは、Cloud プロジェクトのサービス アカウント認証情報を Apps Script プロジェクトに追加する方法について説明します。

Apps Script で Cloud プロジェクトを設定する

  1. Apps Script に移動して、プロジェクトを開くか作成します。


    Apps Script を開く

  2. Apps Script プロジェクトで、[プロジェクトの設定] プロジェクト設定のアイコン をクリックします。

  3. [Google Cloud Platform(GCP)プロジェクト] で、[プロジェクトを変更] をクリックします。

  4. [GCP プロジェクト番号] に、Google Cloud プロジェクト番号を貼り付けます。

  5. [プロジェクトを設定] をクリックします。

認証情報をスクリプト プロパティとして保存する

サービス アカウントの認証情報を Apps Script プロジェクトの設定のスクリプト プロパティとして保存して、安全に保管します。

  1. 前のセクションで作成したサービス アカウントの JSON ファイル(credentials.json)の内容をコピーします。
  2. Apps Script プロジェクトで、[プロジェクトの設定] に移動します。
  3. [プロジェクト設定] ページで、[スクリプト プロパティ] に移動し、[スクリプト プロパティを追加] をクリックして、次のように入力します。
    • [プロパティ] フィールドに「SERVICE_ACCOUNT_KEY」と入力します。
    • [] フィールドに、JSON キーファイルの内容を貼り付けます。
  4. [スクリプト プロパティを保存] をクリックします。

OAuth2 ライブラリを追加する

OAuth2 認証フローを処理するには、Apps Script ライブラリ apps-script-oauth2 を使用します。

Apps Script プロジェクトにライブラリを追加するには:

  1. Apps Script エディタの左側にある [ライブラリ] の横にある [ライブラリを追加] をクリックします。
  2. [スクリプト ID] フィールドに「1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF」と入力します。
  3. [Look up] をクリックします。
  4. 最新バージョンを選択し、[追加] をクリックします。

サービス アカウントの認証情報を使用して API を呼び出す

Apps Script プロジェクトのサービス アカウントの認証情報を使用するには、次の関数 getServiceAccountService() を使用します。

/**
 * Get a new OAuth2 service for a given service account.
 */
function getServiceAccountService() {
  const serviceAccountKeyString = PropertiesService.getScriptProperties()
      .getProperty('SERVICE_ACCOUNT_KEY');

  if (!serviceAccountKeyString) {
    throw new Error('SERVICE_ACCOUNT_KEY property is not set. ' +
        'Please follow the setup instructions.');
  }

  const serviceAccountKey = JSON.parse(serviceAccountKeyString);

  const CLIENT_EMAIL = serviceAccountKey.client_email;
  const PRIVATE_KEY = serviceAccountKey.private_key;

  // Replace with the specific scopes required for your API.
  const SCOPES = ['SCOPE'];

  return OAuth2.createService('ServiceAccount')
      .setTokenUrl('https://oauth2.googleapis.com/token')
      .setPrivateKey(PRIVATE_KEY)
      .setIssuer(CLIENT_EMAIL)
      .setPropertyStore(PropertiesService.getScriptProperties())
      .setScope(SCOPES);
}

SCOPE は、API の呼び出しに必要な認可スコープに置き換えます。スクリプトは、前のステップSERVICE_ACCOUNT_KEY スクリプト プロパティとして保存したサービス アカウントの認証情報を使用します。

これらの認証情報を使用して API を呼び出すことができます。次の例は、UrlFetch サービスを使用しています。

function callApi() {
  const service = getServiceAccountService();

  // TODO(developer): Replace with the payload
  const payload = {};

  // TODO(developer): Replace with the API endpoint
  const response = UrlFetchApp.fetch('API_URL', {
    method: 'post',
    headers: {
      'Authorization': `Bearer ${service.getAccessToken()}`,
      'Content-Type': 'application/json',
    },
    payload: payload,
  });

  const result = JSON.parse(response.getContentText());

  return result;
}

API_URL は、呼び出す HTTP エンドポイントに置き換えます。