Groups API の設定

このページでは、Cloud Identity Groups API の設定方法について説明します。

始める前に

Enable the Cloud Identity API.

Enable the API

クライアント ライブラリのインストール

クライアント ライブラリをインストールするには、次のコマンドを実行します。

Python

Python 開発環境の設定の詳細については、Python 開発環境設定ガイドをご覧ください。

pip install --upgrade google-api-python-client google-auth \
  google-auth-oauthlib google-auth-httplib2

Groups API による認証

Groups API による認証には、エンドユーザー、ドメイン全体の委任がないサービス アカウント グループ管理者、ドメイン全体の委任があるサービス アカウントとしての認証があります。以降のセクションで、それぞれの方法について説明します。

エンドユーザーとして認証

管理者でない場合、または管理者以外のユーザーの代理として動作するアプリケーションを作成する場合は、ウェブサーバー アプリケーションに OAuth 2.0 を使用すると後述のクライアントのインスタンス化をご覧ください。

ドメイン全体の委任がないサービス アカウントとして認証する

サービス アカウントを使用して、グループ管理者としてグループを管理する場合は、次の手順を行います。この認証方法は、サービス アカウントのアクションをサービス アカウントとして監査ログに登録する場合に使用します。

サービス アカウントに管理者ロールを割り当てる

まず、Admin SDK Roles と Role Assignments API を使用して、委任するサービス アカウントに Google Workspace グループ管理者の役割(グループ管理者)を割り当てる必要があります。この手順により、サービス アカウントはドメインのグループにアクセスできるようになりますが、他のリソースにはアクセスできません。

Admin SDK API を使用したロールの管理に関する一般的な情報については、ロール管理ガイドをご覧ください。サービス アカウントのグループ管理者ロールを割り当てるには、次の手順に従います。

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

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

  2. Groups API で使用するサービス アカウントの名前をクリックします。

  3. サービス アカウントの一意の ID をコピーします。

  4. Admin SDK Roles API を呼び出して、グループ管理者の roleId を特定します。これを行うには、Admin SDK ドキュメントの API Explorer を使用します。

  5. 次のリクエスト本文を使用して Role Assignments API を呼び出します。

    {
      "assignedTo": "SERVICE_ACCOUNT_UNIQUE_ID"
      "roleId": "ROLE_ID"
      "scopeType": "CUSTOMER"
      "kind": "admin#directory#roleAssignment"
    }
    

サービス アカウントの認証と承認

これで、グループ管理者のロールを持つサービス アカウントが作成されました。次に、サービス アカウントの OAuth 認証プロセスを完了します。

  • Google Cloud でアプリケーションを開発していて、サービス アカウントがプロジェクトのオーナーである場合、代わりにアプリケーションのデフォルト認証情報を使用すると、プロセスを簡素化できます。詳細については、サービス アカウントとして認証するをご覧ください。

  • サービス アカウントがプロジェクトのオーナーでない場合、以下の手順に従います。

いずれの場合も、Cloud Identity Groups API の適用対象は https://www.googleapis.com/auth/cloud-identity.groups です。

  1. 作成した認証情報を使用して、アクセス トークンを生成します。

    Java

    GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(httpTransport)
        .setJsonFactory(JSON_FACTORY)
        .setServiceAccountId(emailAddress)
        .setServiceAccountPrivateKeyFromP12File(new File("MyProject.p12"))
        .setServiceAccountScopes(ImmutableList.of("https://www.googleapis.com/auth/cloud-identity.groups"))
        .build();
    

    生成されたアクセス トークンを保持します。

サービス アカウントのアクセス トークンを生成するための完全なコード

Java

GenerateServiceAccountOauth2Token.java

package com.google.tools;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.common.collect.ImmutableList;
import java.io.FileInputStream;

/** Command line tool to generate Oauth2 token for a given service account
/** without domain wide delegation. */
public final class GenerateServiceAccountOauth2Token {

  private static final ImmutableList<String> API_SCOPES =
      ImmutableList.of(
          "https://www.googleapis.com/auth/cloud-identity.groups",
          "https://www.googleapis.com/auth/admin.directory.group",
          "https://www.googleapis.com/auth/admin.directory.group.member",
          "https://www.googleapis.com/auth/apps.groups.settings");

  public static void main(final String[] args) throws Exception {
    String accessToken = getTokenFromJsonKey();
    System.out.println("Token: " + accessToken);
  }

  private static String getTokenFromJsonKey() throws Exception {
    GoogleCredential credential =
        GoogleCredential.fromStream(
            new FileInputStream(
                "<path for json file>"),
            new NetHttpTransport(),
            GsonFactory.getDefaultInstance());
    System.out.println("ServiceAccountId=" + credential.getServiceAccountId());

    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = GsonFactory.getDefaultInstance();
    GoogleCredential.Builder builder =
        new GoogleCredential.Builder()
            .setServiceAccountPrivateKey(credential.getServiceAccountPrivateKey())
            .setServiceAccountPrivateKeyId(credential.getServiceAccountPrivateKeyId())
            .setServiceAccountId(credential.getServiceAccountId())
            .setTransport(httpTransport)
            .setJsonFactory(jsonFactory)
            .setServiceAccountScopes(API_SCOPES)
            .setClock(credential.getClock());
    credential = builder.build();
    if (!credential.refreshToken()) {
      throw new Exception("Failed to fetch access token.");
    }
    return credential.getAccessToken();
  }
}

ビルドルール

java_binary(
  name = "generate_oauth2_token",
  srcs = ["GenerateServiceAccountOauth2Token.java"],
  main_class = "com.google.tools.GenerateServiceAccountOauth2Token",
  deps = [
      "//java/com/google/api/client/googleapis/auth/oauth2",
      "//java/com/google/api/client/googleapis/javanet",
      "//java/com/google/api/client/http",
      "//java/com/google/api/client/http/javanet",
      "//java/com/google/common/base",
      "//java/com/google/common/collect",
      "//third_party/java/google_http_java_client:gson",
      "//third_party/java/google_http_java_client:json",
  ],
)

サービス アカウントのテスト

  1. サービス アカウントの認証情報を使用して Groups API 呼び出しを試します(グループの作成、ユーザーの追加、グループ設定の更新など)。

  2. Google 管理コンソールの [レポート] セクションで監査ログを確認します。グループ関連の変更を行う場合は、サービス アカウントがそのアクターとして表示されます。詳細については、ログイベントをご覧ください。

    また、API を使用して監査ログにアクセスすることもできます。Reports API Explorer を使用して確認するには、管理者の OAuth 認証情報を使用してください。

ドメイン全体の委任をもつサービス アカウントとして認証する

自身が ID グループの管理者である場合や、管理者に代わって Google グループを管理できるようドメイン全体の権限をアカウントに付与したい場合は、サービス アカウントとして認証を行う必要があります。

ドメイン全体の委任の設定について詳しくは、ドメイン全体の委任を使用して API アクセスを制御するをご覧ください。

サービス アカウントとして認証を行う方法について詳しくは、サーバー間アプリケーションに OAuth 2.0 を使用するをご覧ください。コード内で認証情報を初期化する場合は、認証情報に対して with_subject() を呼び出すためにサービス アカウントに使用するメールアドレスを指定します。次に例を示します。

Python

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

クライアントのインスタンス化

サービス アカウントの認証情報を使用してクライアントをインスタンス化する方法を、次の例に示します。代わりにエンドユーザーとして認証を受けるには、サービス アカウントの credential オブジェクトを、前のセクションのウェブサーバー アプリケーションに OAuth 2.0 を使用するで取得した credential に置き換えます。

Python

from google.oauth2 import service_account
import googleapiclient.discovery

SCOPES = ['https://www.googleapis.com/auth/cloud-identity.groups']
SERVICE_ACCOUNT_FILE = '/path/to/service-account-file.json'

def create_service():
  credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES)
  delegated_credentials = credentials.with_subject('user@example.org')

  service_name = 'cloudidentity'
  api_version = 'v1'
  service = googleapiclient.discovery.build(
    service_name,
    api_version,
    credentials=delegated_credentials)

  return service

これで、Groups API を呼び出せるようになりました。