Cloud Search Query API에서는 도메인의 라이선스가 부여된 사용자에게 속한 OAuth 사용자 인증 정보를 사용하여 API 호출을 승인해야 합니다. 기본적으로 색인 생성 및 구성 API에 액세스하는 데 사용되는 서비스 계정은 Cloud Search 또는 Google Workspace 라이선스가 있는 도메인 사용자가 아니므로 쿼리 API 호출에 사용할 수 없습니다. 쿼리 API 호출 인증에 서비스 계정을 사용하려는 경우 도메인 관리자가 계정에 사용자 데이터에 대한 도메인 전체 액세스 권한을 부여할 수 있습니다. 이것을 도메인 전체 권한 위임이라고 합니다. 위임된 권한이 있는 서비스 계정은 Cloud Search 액세스 권한이 있는 사용자를 포함한 모든 사용자를 가장할 수 있습니다.
서비스 계정 및 사용자 인증 정보 생성
아직 서비스 계정 사용자 인증 정보가 없는 경우 서비스 계정 사용자 인증 정보 만들기를 참고하세요.
서비스 계정에 도메인 전체 권한 위임
Google Workspace 도메인의 사용자 데이터에 액세스하려면 생성한 서비스 계정에 도메인의 최고 관리자가 액세스 권한을 부여해야 합니다. 도메인 전체 위임에 관한 자세한 내용은 도메인 전체 위임으로 Google Workspace API 액세스 제어하기를 참고하세요.
서비스 계정에 도메인 전체 권한을 위임하려면 다음 단계를 따르세요.
- 도메인의 관리 콘솔에서 기본 메뉴 > 보안 > 액세스 및 데이터 관리 > API 관리로 이동합니다.
도메인 전체 위임 창에서 도메인 전체 위임 관리를 선택합니다.
새로 추가를 클릭합니다.
클라이언트 ID 필드에 위의 서비스 계정 생성 단계에서 얻은 클라이언트 ID를 입력합니다.
OAuth 범위 필드에 애플리케이션에 필요한 범위를 쉼표로 구분하여 입력합니다. Query API를 사용하는 검색 애플리케이션의 경우
https://www.googleapis.com/auth/cloud_search.query
범위를 사용합니다.승인을 클릭합니다.
이제 서비스 계정은 Cloud Search Query API에 대한 도메인 전체 액세스 권한을 가지며 이 범위에 있는 도메인의 모든 사용자를 가장할 수 있습니다. 도메인 사용자를 대신하여 승인된 Cloud Search API 서비스 객체를 인스턴스화할 수 있습니다.
Cloud Search API 서비스 객체 인스턴스화
이 섹션에서는 Cloud Search API 서비스 객체를 인스턴스화한 다음 승인해서 OAuth 2.0과 서비스 계정의 사용자 인증 정보를 사용하여 API 요청을 실행하고 Google Workspace 도메인 전체 위임을 수행하는 방법을 보여줍니다. 예시는 JSON 형식의 비공개 키 파일에서 서비스 계정 정보를 읽습니다.
자바
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 authorized with the service
* account that acts on behalf of the given user.
*
* @param userEmail The email of the user to impersonate. Needs permissions to access Cloud Search.
* @return CloudSearch service object that is ready to make requests.
*/
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();
CloudSearch service = new CloudSearch.Builder(httpTransport, jsonFactory, creds).build();
return service;
}
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 CloudSearch service object authorized with the service
account that acts on behalf of the given user.
Args:
user_email: The email of the user to impersonate. Needs permissions to access Cloud Search.
Returns:
Cloud Search Query API service object that is ready to make requests.
"""
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)