Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

ドメイン全体の委任で実現するGoogle Workspaceユーザー代理のAPI実行

By Nir ForerJul 31, 20244 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

DoiTのミッションは、クラウドユーザーの皆様がworkloadsを効率的かつセキュアに、そしてコストを最適化した形で運用できるよう支援することです。お客様からよくいただくご相談のひとつが、Google Workspace APIの認証プロセスです。特に、ユーザー本人の操作を介さずに代理でAPIを呼び出したいケース、いわゆる2-Legged OAuthフローのシナリオで課題が生じます。

GoogleはAPIとやり取りするための3つの認証方式を提供しています。

1. APIキー:Google Air Quality APIで大気質データを取得する場合など、公開情報へのアクセスに適しています。

2. OAuth認証情報:3-Legged OAuthフローでユーザーの代理としてAPIを呼び出す際、ユーザーの同意が必要なアプリケーションで使用します。

  1. サービスアカウント認証:本記事で取り上げる方式です。ユーザーの操作を必要とせず、ユーザーの代理としてアクションを実行できます。2-Legged OAuthフローで動作します。

具体的なユースケースを考えてみましょう。Workspace組織内のユーザーのカレンダーイベントを取得し、各ユーザーのスケジュールを分析して最適な開催時間を判断するバックエンドアプリケーションを構築するケースです。

このタスクにAPIキーは利用できません(非公開APIには使えないため)。OAuth認証情報なら利用可能ですが、ユーザーの同意が必要となります。一方でサービスアカウント認証を使えば、ユーザーの関与なしにAPIエンドポイントへアクセスできます。本記事ではこの方式を解説します。

サービスアカウント認証を実装し、ユーザーの代理としてGoogle Calendar APIで認可を行う手順は次のとおりです。

1. Google Cloudのサービスアカウントを作成する。

2. サービスアカウントにドメイン全体の権限を委任する。これはGoogle Workspace管理者のみが実施できる作業です。

3. 委任された認証情報を用いてGoogle Calendar APIで認証を行う。これはユーザーインパーソネーション(なりすまし)とも呼ばれるプロセスです。

以下は、Pythonで委任された認証情報を使ってAPIクライアントを初期化するコードスニペットです。


from __future__ import print_function
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
from google.oauth2 import service_account
SCOPES = ['https://www.googleapis.com/auth/calendar']
SERVICE_ACCOUNT_FILE = 'credentials.json'

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

def main():
    delegated_credentials = credentials.with_subject('[email protected]')
    service = build('calendar', 'v3', credentials=delegated_credentials)
    events_results = service.calendars().events.list(calendarId='primary').execute()
    events = events_result.get("items", [])

  if not events:
      print("No upcoming events found.")
      return

    for event in events:
      start = event["start"].get("dateTime", event["start"].get("date"))
      print(start, event["summary"])

if __name__ == '__main__':
    main()

重要な点として、APIを呼び出す対象のユーザーごとに、委任された認証情報でAPIクライアントを初期化する必要があります。

    delegated_credentials = credentials.with_subject('[email protected]')
    service = build('calendar', 'v3', credentials=delegated_credentials)

[email protected] は、API呼び出しを代行する対象のWorkspaceユーザーであり、このケースでは当該ユーザーのカレンダーへアクセスします。

このアプローチは、Calendar Python APIクライアントのクイックスタートガイドで紹介されているOAuth認証情報による方式とは異なります。クイックスタートでは、ユーザーの同意が必要な3-Legged OAuthフローが用いられています。

本記事では、特にユーザーの操作を認証フローに含めるべきでないシナリオを念頭に、Google Workspace APIのバックエンド認証について整理しました。本ガイドが疑問解消の一助となれば幸いです。当社の専門領域については、https://www.doit.com/services/ をぜひご覧ください。

Piyush Patil

2024年7月30日

employed

Should be "deployed" I think :)

返信

Piyush Patil

2024年7月30日

retrieving

"r" should be upper case.

返信

Piyush Patil

2024年7月30日

本記事で取り上げる方式です。ユーザーの操作を必要とせず、ユーザーの代理としてアクションを実行できます。2-Legged OAuthフローで動作します。

Formatting should not be bold letters.

返信

すべての返信を見る

by

[GKE内部アプリケーションアクセスのモダナイゼーション:VPNからIAP対応の外部ゲートウェイへ\ \

2025年1月13日

by

[MCPサーバーとStrands AgentsによるAWSアーキテクチャ構築\ \

2025年9月22日

by

[AWS WAFとその先で活用するJA3・JA4フィンガープリント\ \

2025年4月10日

by

[VPCアーキテクチャパターン:AWSとGCPにおけるスタンドアロン型と集中型の比較\ \

2024年11月25日

by

[Stanfordがわずか8語でプロンプトエンジニアリングに終止符を打った(しかも本当に効いた)\ \

2025年10月19日

[A clap icon25K\ \

[2026年にClaude(およびあらゆるコーディングエージェント)で必須となる10のスキル\ \

3月9日

[A clap icon1K\ \

[ダッシュボードとデザインシステムの終焉\ \

2025年11月26日

[A clap icon6.5K\ \

[Anthropicが(新)Claude Code Autoモードを追加(パーミッションモードはもう不要)\ \

6日前

[A clap icon391\ \

by

[ローカルAI向けに、あなたはおそらく間違ったマシンを買っている — Mac Mini M4とMini PC、誰も語らない真実…\ \

3月20日

[A clap icon1.1K\ \

by

[30日間ChatGPTを使うのをやめてみた。脳に起きたことは恐ろしかった。\