怠惰な努力家

くいっぱぐれないように日々勉強していることを記すブログ

Google Workspace (Formerly G Suite)のAPIをService Accountで利用する方法

はじめに

Service Accountを使って、Admin APIを呼び出せるのですが少々ハマったので備忘がてらに記事にします。
ちゃんと説明しているページを見つけてしまえば早かったですがそこにたどり着くまで時間がかかりハマってしまいました。
以下に参考になるページのリンクを張っておきましたのでご参考にしていただければと思います。

Service Accountとは

つまるところユーザアカウントに紐づかないアカウントです。
Service Accountに権限を付与することによってService Accountが代理でJobを実行する仕組みです。ユーザ側としてはそのService Accountを利用する権限を持っていればよく、ユーザの権限では実施できないこともService Accountにやってもらうことができます。(Service Account Userとして権限付与は必要です)。
ただし、なぜかGoogle WorkspaceのAdmin APIではユーザ側も結局API利用権限が必要です。

Google WorkspaceでのService Account利用の流れ

  1. Developer Consoleでの設定
    1. Google Admin APIの有効化
    2. Service Accountの作成およびKeyの作成
    3. Domain-wide Delegationの有効化
  2. Admin Consoleでの設定
    1. Delegationの設定
    2. Delegate先のユーザにAdmin API利用権限の付与

1-1から1-3と2-1のやり方については、すべてここに書いてあります。
Perform Google Workspace Domain-Wide Delegation of Authority

2-2については、Admin Roleの設定で、以下に記載があります。
Create, edit, and delete custom admin roles - Google Workspace Admin Help

コード例

上記ページにPython等でのKeyファイルの読み込み例の記載がありますが、なぜか推奨方法ファイル形式はjsonであるにもかかわらず、p12の場合を例にしています。Jsonの場合は以下のとおりであり、ほとんど変わりません。

#    credentials = ServiceAccountCredentials.from_p12_keyfile(
#       SERVICE_ACCOUNT_EMAIL,
#        SERVICE_ACCOUNT_PKCS12_FILE_PATH,
#       'notasecret',
#       scopes=['https://www.googleapis.com/auth/admin.directory.user'])
credentials = ServiceAccountCredentials.from_json_keyfile_name(filename=filename, scope=scope)

Scopeについて

以下を参考に必要なスコープを設定しましょう。
Directory API: Authorize Requests  |  Google Developers
例えば、Groupsの設定変更をしたいのであれば、以下を指定します。

['https://www.googleapis.com/auth/admin.directory.group']

([]で囲ってあげないとエラーになります。)

最後に

いまいちDelegateの部分が良くわからないので詳しい人教えていただけると幸いです。
Service Account利用者側からすると、Keyファイルさえあればどの任意のユーザで試せちゃうというのはセキュリティ上よろしくない気がしますが、どのように使うのが正解なのでしょうか?
なんにせよこれで入退社の管理タスクはすこしは楽にできます。