LoginSignup
0
0

Cloud Identity APIでGoogle Workspaceのグループ(Google Groups)を操作する

Posted at

概要

ビジネスアカウント(じゃないとダメっぽい)のGoogle Workspaceのグループ(Google Groups)をメーリングリストとして使用する際のメンバー操作をするためにCloud Identity APIをPythonで使ったのでまとめます。サーバー側操作なのでサービスアカウントを使いました。

よく使われる手段はAdmin Directory APIだと思いますが、使用するサービスアカウントに対してドメイン全体の委任が必要になるため、それを避けるためにいろいろと調べた結果Cloud Identity APIで行うことができました。普段GCPを使わないので、用語などがおかしい部分があるかもしれませんが、ご容赦下さい。

準備

それほど複雑な手順はないと思います。サービスアカウントの作成まではできているものとします。使用するサービスアカウントはディフォルトの設定で作成したものです。

  • サービスアカウントのプロジェクトに対してCloud Identity APIを有効にする
  • 対象となるグループをGoogle WorkspaceのWebコンソールで作成する
  • 対象となるグループに使用するサービスアカウントを追加する
  • API操作可能

アカウントおよびグループの準備

サービスアカウントをディフォルト設定で作成します。また、プロジェクトが使用するAPIとしてCloud Identity APIを有効にしておきます。また、サービスアカウントのJSONファイルをダウンロードしておきます。APIでのグループの操作ドキュメントにはグループ管理特権を追加する(roleAssignments)などが書かれていますが、このやり方だと不要でした。

対象となるGoogle GroupsをGoogle WorkspaceのWebコンソールで作成します。必要な状況に応じて権限の設定などを行って下さい。続いて、用意しておいたサービスアカウントのメールアドレスを「マネージャー」として追加します(メンバーの表示や管理ができるロールを付与しておきます)。

実装

環境

  • Rocky Linux 9.3 + Python 3.11
  • google-api-python-client 2.125.0
  • oauth2client 4.1.3

コード

  • サービスアカウントのJSONを service-account.json とします

メンバーのリストを得る

#!/usr/bin/env python3
import json
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient.discovery import build

SCOPES = ["https://www.googleapis.com/auth/cloud-identity.groups"]
CUSTOMER_ID = "C01xxxxxx"
GROUP_ID = "mygroup@example.com"

# 認証情報の読み込みとサービス構成
keyobj = json.load(open("service-account.json"))
creds = ServiceAccountCredentials.from_json_keyfile_dict(keyobj, SCOPES)
service = build("cloudidentity", "v1", credentials=creds)
groups = service.groups()

# グループ名(groups/01xxxxxxxxxxxxx)をグループアドレスから得る
group_name = None
res = groups.list(parent=f"customers/{CUSTOMER_ID}").execute()
for grp in res["groups"]:
    if grp["groupKey"]["id"] == GROUP_ID:
        group_name = grp["name"]
        break
assert group_name

# メンバーのリストを得る
res = groups.memberships().list(parent=group_name).execute()
for user in res["memberships"]:
    print(user)

メンバーをグループに追加する

上のコード中のgroup_nameを使ってます。

NEW_MEMBER_EMAIL = "foo@example.com"
membership = {
    "preferredMemberKey": {"id": NEW_MEMBER_EMAIL},
    "roles": {"name": "MEMBER"},
}
res = groups.memberships().create(parent=group_name, body=membership).execute()
print(res)

メンバーをグループから削除する

# メンバーのIDが必要となるので検索
res = groups.memberships().list(parent=group_name).execute()
for user in res["memberships"]:
    if user["preferredMemberKey"]["id"] == NEW_MEMBER_EMAIL:
        # メンバーのIDが得られた
        res = groups.memberships().delete(name=user["name"]).execute()
        print(res)
        break

まとめ

Google WorkspaceのAPIはクセが強いので私はあまり使わないのですが、今回は動的にメーリングリストを操作したかったのでGoogle Groupsを使うことにしてみました。

どなたかのお役に立てば幸いです。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0