執行 Google Workspace 全網域授權委派

Google Cloud Search Query API 要求呼叫必須由授權網域使用者授權。由於服務帳戶不是授權網域使用者,因此預設無法呼叫 Query API。如要讓服務帳戶發出 Query API 呼叫,網域管理員可以使用「全網域授權委派」功能,授予服務帳戶網域使用者資料的存取權。具備委派授權的服務帳戶可以模擬任何有權存取 Cloud Search 的使用者。

建立服務帳戶和憑證

如果沒有服務帳戶憑證,請參閱建立服務帳戶憑證

將全網域授權委派給服務帳戶

如要存取 Google Workspace 網域中的使用者資料,網域的超級管理員必須授予服務帳戶存取權。詳情請參閱「使用全網域委派功能控管 Google Workspace API 存取權」。

如何將網域層級的權限委派給服務帳戶:

  1. 在網域的管理控制台中,依序前往「主選單」>「安全性」>「存取權與資料控管」>「API 控制項」
  2. 在「全網域委派」窗格中,選取「管理全網域委派設定」
  3. 點選「新增」
  4. 在「用戶端 ID」欄位中,輸入服務帳戶的用戶端 ID。
  5. 在「OAuth 範圍」欄位中,以半形逗號分隔的清單形式輸入必要範圍。使用 https://www.googleapis.com/auth/cloud_search.query 搜尋應用程式。
  6. 點選「授權」

您的服務帳戶現在擁有 Cloud Search Query API 的網域層級存取權,並可在此範圍內模擬網域中的任何使用者。您現在可以代表網域使用者,例項化授權的 Cloud Search API 服務物件。

建立 Cloud Search API 服務物件的例項

本節說明如何使用 OAuth 2.0 和服務帳戶憑證,例項化及授權 Cloud Search API 服務物件。這些範例會從服務帳戶的 JSON 私密金鑰檔案讀取資訊。

Java

import java.util.Collections;
import java.io.FileInputStream;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.services.cloudsearch.v1.CloudSearch;
import com.google.api.services.cloudsearch.v1.CloudSearchScopes;
...

/** Path to the Service Account's Private Key file */
private static final String SERVICE_ACCOUNT_FILE_PATH = "/path/to/key.json";

/**
 * Build and return a Cloud Search service object.
 *
 * @param userEmail The email of the user to impersonate.
 * @return CloudSearch service object.
 */
public static CloudSearch getCloudSearchAPIService(String userEmail)
    throws FileNotFoundException, IOException {

  FileInputStream credsFile = new FileInputStream(SERVICE_ACCOUNT_FILE_PATH);
  GoogleCredential init = GoogleCredential.fromStream(credsFile);

  HttpTransport httpTransport = init.getTransport();
  JsonFactory jsonFactory = init.getJsonFactory();

  GoogleCredential creds = new GoogleCredential.Builder()
      .setTransport(httpTransport)
      .setJsonFactory(jsonFactory)
      .setServiceAccountId(init.getServiceAccountId())
      .setServiceAccountPrivateKey(init.getServiceAccountPrivateKey())
      .setServiceAccountScopes(Collections.singleton(
          CloudSearchScopes.CLOUD_SEARCH_QUERY))
      .setServiceAccountUser(userEmail)
      .build();

  return new CloudSearch.Builder(httpTransport, jsonFactory, creds).build();
}

Python

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Path to the Service Account's Private Key file
SERVICE_ACCOUNT_FILE_PATH = "/path/to/key.json"

def create_query_api_service(user_email):
    """Build and return a Cloud Search service object.

    Args:
        user_email: The email of the user to impersonate.
    Returns:
        Cloud Search Query API service object.
    """
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE_PATH,
        scopes=['https://www.googleapis.com/auth/cloud_search.query'])

    delegated_credentials = credentials.with_subject(user_email)

    return build("cloudsearch", "v1", credentials=delegated_credentials)