Google Cloud Search Query API 要求呼叫必須由授權網域使用者授權。由於服務帳戶不是授權網域使用者,因此預設無法呼叫 Query API。如要讓服務帳戶發出 Query API 呼叫,網域管理員可以使用「全網域授權委派」功能,授予服務帳戶網域使用者資料的存取權。具備委派授權的服務帳戶可以模擬任何有權存取 Cloud Search 的使用者。
建立服務帳戶和憑證
如果沒有服務帳戶憑證,請參閱建立服務帳戶憑證。
將全網域授權委派給服務帳戶
如要存取 Google Workspace 網域中的使用者資料,網域的超級管理員必須授予服務帳戶存取權。詳情請參閱「使用全網域委派功能控管 Google Workspace API 存取權」。
如何將網域層級的權限委派給服務帳戶:
- 在網域的管理控制台中,依序前往「主選單」>「安全性」>「存取權與資料控管」>「API 控制項」。
- 在「全網域委派」窗格中,選取「管理全網域委派設定」。
- 點選「新增」。
- 在「用戶端 ID」欄位中,輸入服務帳戶的用戶端 ID。
- 在「OAuth 範圍」欄位中,以半形逗號分隔的清單形式輸入必要範圍。使用
https://www.googleapis.com/auth/cloud_search.query搜尋應用程式。 - 點選「授權」。
您的服務帳戶現在擁有 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)