設定 Groups API
本頁面說明如何設定 Cloud Identity Groups API。
事前準備
Enable the Cloud Identity 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 角色和角色指派 API,將 Google Workspace 群組管理員角色 (群組管理員) 指派給要委派的服務帳戶。這個步驟會讓服務帳戶存取網域的群組,但不會存取其他資源。
如要進一步瞭解如何使用 Admin SDK API 管理角色,請參閱管理角色指南。請按照下列步驟為服務帳戶指派群組管理員角色。
前往 Google Cloud 控制台的「Service Accounts」(服務帳戶) 頁面:
按一下要與 Groups API 搭配使用的服務帳戶名稱。
複製服務帳戶的專屬 ID。
呼叫 Admin SDK Roles API,即可識別群組管理員的
roleId
。您可以使用 Admin SDK 說明文件中的 API Explorer 執行這項操作。使用以下要求主體呼叫 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
。
使用剛才建立的憑證,產生存取權杖。
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",
],
)
測試服務帳戶
請使用服務帳戶憑證嘗試任何 Groups API 呼叫,例如建立群組、新增使用者、更新群組設定等。
請前往 Google 管理控制台的「報表」專區查看稽核記錄。您應該會看到服務帳戶是群組相關變更的執行者。詳情請參閱「記錄事件」。
或者,您也可以使用 API 存取稽核記錄。如要使用 Reports API Explorer 進行檢查,請務必使用管理員 OAuth 憑證。
以全網域委派功能的服務帳戶進行驗證
如果您是管理身分群組的管理員,或是想為帳戶提供網域層級權限,以便代表管理員管理 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。