G Suite 도메인 전체 권한 위임 수행

Cloud Search Query API에서는 도메인의 라이선스가 부여된 사용자에게 속한 OAuth 사용자 인증 정보를 사용하여 API 호출을 승인해야 합니다. 기본적으로 색인 생성 및 구성 API에 액세스하는 데 사용되는 서비스 계정은 Cloud Search 또는 G Suite 라이선스가 있는 도메인 사용자가 아니므로 쿼리 API 호출에 사용할 수 없습니다. 쿼리 API 호출 인증에 서비스 계정을 사용하려는 경우 도메인 관리자가 계정에 사용자 데이터에 대한 도메인 전체 액세스 권한을 부여할 수 있습니다. 이것을 도메인 전체 권한 위임이라고 합니다. 위임된 권한이 있는 서비스 계정은 Cloud Search 액세스 권한이 있는 사용자를 포함한 모든 사용자를 가장할 수 있습니다.

서비스 계정 및 사용자 인증 정보 생성

아직 서비스 계정 사용자 인증 정보가 없는 경우 서비스 계정 사용자 인증 정보 만들기를 참조하세요.

서비스 계정에 도메인 전체 권한 위임

생성한 서비스 계정에 액세스하려는 G Suite 도메인의 사용자 데이터에 대한 액세스 권한을 부여해야 합니다. 관리 콘솔에 액세스할 수 있는 사용자가 다음 작업을 수행해야 합니다.

  1. 도메인의 관리 콘솔로 이동합니다.
  2. 컨트롤 목록에서 보안을 선택합니다. 보안이 목록에 없으면 페이지 아래의 회색 막대에서 컨트롤 추가를 선택한 후 위젯 목록에서 보안을 선택합니다.
  3. 옵션 목록에서 고급 설정을 선택합니다.
  4. 인증 섹션에서 API 클라이언트 액세스를 선택합니다.
  5. 클라이언트 이름 필드에 위의 서비스 계정 생성 단계에서 얻은 클라이언트 ID를 입력합니다.
  6. 하나 이상의 API 범위 필드에 애플리케이션에 필요한 범위를 입력합니다. Query API를 사용하는 검색 애플리케이션의 경우 https://www.googleapis.com/auth/cloud_search.query 범위를 사용합니다.
  7. 승인 버튼을 클릭합니다.

이제 서비스 계정은 Cloud Search Query API에 대한 도메인 전체 액세스 권한을 가지며 이 범위에 있는 도메인의 모든 사용자를 가장할 수 있습니다. 도메인 사용자를 대신하여 승인된 Cloud Search API 서비스 객체를 인스턴스화할 수 있습니다.

Cloud Search API 서비스 객체 인스턴스화

이 섹션에서는 Cloud Search API 서비스 객체를 인스턴스화한 다음 승인해서 OAuth 2.0과 서비스 계정의 사용자 인증 정보를 사용하여 API 요청을 실행하고 G Suite 도메인 전체 위임을 수행하는 방법을 보여줍니다. 예시는 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))
          .setServiceAccountUser(userEmail)
          .build();

     CloudSearch service = new CloudSearch.Builder(httpTransport, jsonFactory, creds).build();

     return service;
    }
    

Python

from googleapiclient.discovery import build
    from oauth2client.service_account import ServiceAccountCredentials

    # 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 = ServiceAccountCredentials.from_json_keyfile_name(
          SERVICE_ACCOUNT_FILE_PATH,
          scopes=['https://www.googleapis.com/auth/cloud_search.query'])

      credentials = credentials.create_delegated(user_email)

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