API 승인

호텔 API에 액세스할 때 애플리케이션을 승인하려면 OAuth 2.0을 사용합니다.

OAuth 2.0 설정

OAuth 2.0을 사용하려면 Google 계정과 연결된 서비스 계정을 사용하여 본인을 식별해야 합니다. 서비스 계정은 OAuth 2.0 액세스 토큰을 받는 대가로 비공개 키를 전송합니다. 그런 다음 이 토큰을 호텔 API를 호출하여 읽기 전용 데이터(예: 가격, 호텔, 호텔 가격 피드에 관한 진단 보고 데이터)에 사용할 수 있습니다.

액세스 토큰은 1시간 (3,600초) 동안 유효합니다.

이전에 ClientLogin을 구현한 경우 OAuth 2.0 접근 방식은 비슷하지만 다음과 같은 차이점이 있습니다.

  • 애플리케이션은 Google 서비스 계정을 사용하여 API에 액세스합니다.
  • API를 호출할 때 Authorization HTTP 헤더에 OAuth 2.0 액세스 토큰을 전달합니다.

Travel Partner API로 OAuth 2.0을 사용하도록 계정을 설정하려면 다음 단계를 따르세요.

  1. Google Developers Console (DevConsole)에서 새 프로젝트 만들기

  2. 새 프로젝트의 Travel Partner API에 대한 액세스 사용 설정

  3. 서비스 계정 및 사용자 인증 정보 만들기

  4. 서비스 계정에 호텔 데이터에 대한 액세스 권한 부여하기

다음 섹션에서 각 단계를 설명합니다.

1단계: 새 DevConsole 프로젝트 만들기

Google Developers Console ('DevConsole')은 프로젝트에서 사용하는 Google API의 트래픽 데이터, 인증, 결제 정보를 관리하고 확인하기 위한 Google의 개발자 환경입니다.

DevConsole에서 프로젝트는 작업 중인 애플리케이션 또는 애플리케이션에 대한 설정, 사용자 인증 정보, 메타데이터의 모음이며 Google Developer API와 Google Cloud 리소스를 사용합니다.

DevConsole에서는 API 사용자 인증 정보 생성, API 활성화, 프로젝트와 관련된 팀 및 결제 정보 관리 등 프로젝트의 이러한 측면을 관리할 수 있습니다.

새 DevConsole 프로젝트를 만들려면 다음 단계를 따르세요.

  1. Gmail/Google 계정에 로그인합니다.

  2. Google Developer Console을 엽니다. 첫 번째 프로젝트인 경우 기본 뷰에 간단한 CREATE PROJECT 버튼이 표시됩니다.

    fig1

  3. 프로젝트 만들기 버튼을 클릭합니다. DevConsole에 New Project 대화상자가 표시됩니다.

    fig2

    프로젝트 이름 입력 필드에 새 프로젝트의 친숙한 이름을 입력합니다. DevConsole은 필드 아래에서 프로젝트 ID를 생성하여 ID가 모든 프로젝트에서 고유한지 확인합니다. 예를 들어 'My New Project'를 입력하면 DevConsole은 my-new-project-266022와 같은 ID를 할당합니다.

  4. 만들기 버튼을 클릭하여 새 프로젝트를 만듭니다.

  5. 탐색 메뉴에서 API 및 서비스 > 대시보드를 선택합니다.

    fig3

    아래 이미지는 DevConsole의 왼쪽 상단에 있는 탐색 메뉴를 보여줍니다. 이렇게 하면 프로젝트의 대시보드 뷰가 표시됩니다.

    fig4

자세한 내용은 Developers Console에서 프로젝트 관리를 참고하세요.

새 프로젝트를 만들 때 프로젝트에 연결된 API가 아직 없습니다. 다음 단계에서는 새 프로젝트에 Travel Partner API를 사용 설정합니다.

2단계: 새 프로젝트에 Travel Partner API 사용 설정

호텔 API를 사용하려면 새 DevConsole 프로젝트에서 Travel Partner API를 사용 설정해야 합니다.

새 프로젝트에 호텔 API를 사용 설정하려면 다음 안내를 따르세요.

  1. 위에서 설명한 대로 프로젝트의 대시보드 뷰로 이동합니다.

  2. API 및 서비스 사용 설정을 클릭합니다. 그러면 API 라이브러리 시작 페이지가 표시됩니다.

  3. 검색창에 Travel Partner API를 입력합니다. Google API 콘솔에는 입력한 내용과 일치하는 API 목록이 표시됩니다.

  4. 일치하는 API 표에서 Travel Partner API를 클릭합니다. DevConsole은 API에 대한 설명을 표시합니다.

  5. API 사용 설정 버튼을 클릭하여 프로젝트에서 이 API를 사용 설정합니다.

자세한 내용은 API 활성화 및 비활성화를 참고하세요.

이제 Google 계정의 새 프로젝트에 Hotel API가 사용 설정되었습니다.

다음 단계는 서비스 계정을 만들고 키를 생성하는 것입니다.

3단계: 서비스 계정 만들기 및 사용자 인증 정보 생성

서비스 계정은 웹 애플리케이션과 호텔 데이터 간의 상호작용과 같은 서버 간 상호작용에 사용됩니다.

서비스 계정을 만들고 구성하려면 다음 안내를 따르세요.

  1. Google API 콘솔 기본 뷰의 왼쪽 탐색 메뉴에서 사용자 인증 정보를 클릭합니다. DevConsole에 Credentials(사용자 인증 정보) 뷰가 표시됩니다.

    Credentials(사용자 인증 정보) 뷰에는 프로젝트의 클라이언트 ID와 사용자 인증 정보가 표시됩니다. 애플리케이션은 OAuth 2.0 액세스 토큰을 요청할 때 클라이언트 ID를 사용합니다. 새 프로젝트에는 아직 클라이언트나 사용자 인증 정보가 없습니다.

  2. API 및 서비스의 사용자 인증 정보 링크를 클릭합니다.

  3. 사용자 인증 정보 만들기 버튼을 클릭하고 드롭다운에서 서비스 계정 키를 선택합니다. 서비스 계정 키 만들기 뷰가 표시됩니다.

  4. 서비스 계정 드롭다운에서 새 서비스 계정을 선택합니다.

  5. 서비스 계정 이름과 서비스 계정 ID를 입력합니다.

    이름은 원하는 대로 지정할 수 있지만 계정 ID는 모든 프로젝트에서 고유해야 합니다. 입력한 이름을 기반으로 DevConsole에서 고유한 계정 ID를 생성합니다.

  6. 아래와 같이 키 유형으로 P12를 선택합니다. P12는 필수 항목입니다.

    fig5

  7. 만들기 버튼을 클릭합니다. DevConsole은 프로젝트의 비공개/공개 키 쌍을 생성합니다. 비공개 키는 브라우저가 다운로드를 저장하는 기본 위치에 저장됩니다. .json 파일 형식이 아닌 .p12 형식 (바이너리)을 다운로드해야 합니다.

    Travel Partner API에 액세스하는 스크립트 또는 다른 애플리케이션에서 비공개 키를 사용합니다.

    DevConsole은 키 생성이 완료되면 다음 알림을 표시합니다.

    fig6

  8. 확인 버튼을 클릭합니다. DevConsole을 클릭하면 Credentials(사용자 인증 정보) 뷰로 돌아갑니다. 서비스 계정의 세부정보를 확인하고 프로젝트에 연결된 서비스 계정을 보려면 이 뷰에서 서비스 계정 관리를 클릭합니다.

    이제 서비스 계정에 다음과 같은 사용자 인증 정보가 연결되어 있습니다.

    • 클라이언트 ID: OAuth 2.0 액세스 토큰을 요청할 때 애플리케이션에서 사용하는 고유 식별자입니다.
    • 이메일 주소: 서비스 계정을 위해 'account_name@project_name.google.com.iam.gserviceaccount.com' 형식으로 생성된 이메일 주소입니다.
    • 인증서 지문:다운로드한 비공개 키의 ID입니다.

자세한 내용은 서버 간 애플리케이션에서 OAuth 2.0 사용하기를 참고하세요.

4단계: 서비스 계정에 Hotel Center 데이터에 대한 액세스 권한 부여하기

마지막 단계는 새 서비스 계정에 Hotel Center 액세스 권한을 제공하는 것입니다. 서비스 계정은 이전 단계에서 만든 생성된 이메일 주소로 식별됩니다. Hotel Center 공유 설정을 사용하여 이 계정에 대한 액세스 권한을 제공합니다.

서비스 계정에 Hotel Center 데이터에 대한 액세스 권한을 부여하려면 다음 안내를 따르세요.

계정에 사용자를 추가할 수 있는 적절한 액세스 권한이 없는 경우 문의하기 양식을 사용하여 Google 호텔팀에 연락하여 계정의 소유권 설정을 요청하세요. 소유자에게 이메일을 하나 이상 전송하도록 요청할 수 있습니다. Hotel Center 액세스 권한에 대한 자세한 내용은 Hotel Center와 Google Ads 연결을 참고하세요.

  1. 새 브라우저 창에서 Hotel Center를 엽니다. fig7

  2. Hotel Center by Google 배너에서 사용자 추가 아이콘을 클릭하여 공유 대화상자를 엽니다.

    fig8

  3. 사용자 추가 필드에 Hotel Center에 추가할 서비스 계정의 이메일 주소를 입력합니다.

  4. 이메일 알림 보내기 옵션을 선택된 상태로 둡니다.

  5. 드롭다운 메뉴에서 관리를 선택합니다.

  6. 초대 버튼을 클릭합니다.

  7. Hotel Center에 사용자를 추가한 후 약 24시간 이내에 서비스 계정에서 API 액세스가 사용 설정됩니다.

Google에서 서비스 계정에 API 액세스가 사용 설정되었다는 알림을 받으면 OAuth로 API에 액세스할 수 있습니다.

OAuth 2.0 사용

API에 액세스하려면 애플리케이션이 서비스 계정에서 생성된 이메일 주소와 비공개 키를 통해 Google에 자신을 식별해야 합니다. Google의 인증 메커니즘은 이 키를 앱의 API 호출에서 Authorization 헤더에 전달하는 OAuth 2.0 액세스 토큰으로 교환합니다.

액세스 토큰 (Bearer 토큰이라고도 함)은 OAuth 2.0 표준의 일부입니다. HTTP 헤더에 액세스 토큰을 지정하는 구문은 다음과 같습니다.

Authorization: Bearer *oauth2_access_token*

다음 예는 Reports API에 액세스하는 요청의 HTTP 헤더 샘플입니다.

GET /travelpartner/v2.0/42000042/reports/top_opportunity_7_day HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer nd42.fdLSKkljD98344444444444lSDF42fdLSKkljD98344444444444lSDF42
Cache-Control: no-cache

액세스 토큰을 생성하려면 원하는 언어로 애플리케이션을 만드세요. 다음 예시에서는 Python으로 토큰을 생성합니다. 그러면 Travel Partner API에 액세스할 때 요청의 Authorization 헤더에 이 토큰을 사용할 수 있습니다.

#!/usr/bin/python2.7
#
""" Sample code to get an auth header that you can use in your HTTP requests
    1. Please see https://developers.google.com/api-client-library/python/start/installation
       to download and install the google-api-python-client package.
    2. Edit lines below marked _SERVICE_ACCOUNT, _KEY_FILE,  _PARTNER_NAME,
       and _API_VERSION.
    3. Run the program using: "python sample.py". The app returns the value that
       you use for the Authorization header's Bearer token in your request.
    4. Copy the token and use it in requests to the Travel Partner API.
       For example (2.0):
       https://www.googleapis.com/travelpartner/2.0/42000042/reports/budget
       For example (1.x):
       https://www.googleapis.com/travelpartner/1.2/reports?report_type=BUDGET
"""
import httplib2
import json
import os
import sys
import urllib

HAS_CRYPTO = False

from apiclient import discovery
from oauth2client.client import flow_from_clientsecrets
try:
  # Some systems may not have OpenSSL installed so can't use SignedJwtAssertionCredentials.
  from oauth2client.client import SignedJwtAssertionCredentials
  HAS_CRYPTO = True
except ImportError:
  print "Unable to import SignedJwtAssertionCredentials"

from oauth2client import tools
from oauth2client.file import Storage

# Authorization scope for our requests (do not change)
_DEFAULT_APISCOPE = 'https://www.googleapis.com/auth/travelpartner'

# Use the service account you set up in the Google Developers Platform.
# It will be of the form "gsaccount_name@project_name.google.com.iam.gserviceaccount.com".
_SERVICE_ACCOUNT = ('myserviceaccount@my-hotel-project.google.com.iam.gserviceaccount.com')

# Set this to the full path to your service account's private binary .p12 key file
# that you downloaded from the Google Developer's Console and stored in a secure place.
# DO NOT use the json version of the certificate.
_KEY_FILE = '../mylocaldir/api-keys/8482bb2bdb08.p12'

# Set this to the case-sensitive "Partner Key", NOT the account
# name in the Hotel Ads Center or the numeric partner ID.
# Check with your TAM if you do not know your "Partner Key" name.
_PARTNER_NAME = 'testpartner2'

class HotelAdsAPIConnection(object):
  def __init__(self, service_account=_SERVICE_ACCOUNT, key=_KEY_FILE, partner=_PARTNER_NAME):
    self.key_file = key
    self.account = service_account
    self.partner = partner

  def InitializeCredentials(self, scope):
    '''Get credentials for use in API requests.
    Generates service account credentials if the key file is present,
    and regular user credentials if the file is not found.
    '''
    if os.path.exists(self.key_file):
      if not HAS_CRYPTO:
        raise Exception("Unable to use cryptographic functions "
                        + "Try installing OpenSSL")
      with open (self.key_file, 'rb') as file:
        key = file.read();
      creds = SignedJwtAssertionCredentials(self.account, key, scope)
      self.credentials = creds

  def authorize(self):
    '''Construct a HTTP client that uses the supplied credentials.'''
    return credentials.authorize(httplib2.Http())

  def print_creds(self):
    '''Prints the Authorization header to use in HTTP requests.'''
    cred_dict = json.loads(self.credentials.to_json())

    if 'access_token' in cred_dict:
      print 'Authorization: Bearer %s' % (cred_dict['access_token'],)
    else:
      print 'creds: %s' % (cred_dict,)

  def GetConnection(self):
    http = httplib2.Http()
    self.credentials.refresh(http)
    http = self.credentials.authorize(http)
    self.print_creds()
    return http

def main(args):
  # Create an instance of the HotelAdsAPIConnection inner class
  api = HotelAdsAPIConnection()

  # Generate credentials
  api.InitializeCredentials(_DEFAULT_APISCOPE)

  # Output the Authorization header to use in HTTP requests
  api.GetConnection()

if __name__ == "__main__":
    main(sys.argv)</pre>

애플리케이션을 개발할 때 API 키를 안전하게 사용하기 위한 권장사항을 따르세요.

샘플 Python 스크립트는 다음 예시와 같이 Authorization 헤더의 Bearer 토큰을 출력합니다.

$ python sample.py
Authorization: Bearer ya29.42424242sample_420icu8122KSvoh4T42cRoG3rW1lc0Q
$

요청에 토큰의 값을 사용합니다. 생성 후 1시간 동안 유효합니다.

문제 해결

문제가 발생했나요? 다음 항목을 빠르게 확인하면 문제가 해결될 수도 있습니다.

  1. Google Developer Console에서 프로젝트를 만드셨나요?
  2. Travel Partner API을(를) 찾아서 사용 설정하셨나요?
  3. 클라이언트 ID 만들기를 클릭하고 서비스 계정을 선택한 후 비공개 키인 .p12 파일을 다운로드했나요?
  4. nnnnnnn@app_name.google.com.iam.gserviceaccount.com 양식의 서비스 계정 클라이언트 ID 이메일 주소를 받았나요?
  5. 이 계정 공유 버튼을 클릭하여 호텔 광고 센터 계정을 서비스 계정과 공유했나요?
  6. 서비스 계정의 이메일 주소와 파트너 ID를 기술계정 관리자 (TAM)에게 보냈나요?
  7. Travel Partner API 호출이 Authorization 헤더에서 최근에 가져온 토큰을 전달하나요?
  8. Authorization 헤더의 Bearer 토큰이 1시간 이상 지났나요?

다음 표에는 몇 가지 일반적인 오류와 가능한 해결 방법이 나와 있습니다.

오류 설명
Invalid credentials 이는 다양한 상황을 의미할 수 있습니다. 이 오류가 발생하면 다음을 확인하세요.
  • 유효한 Bearer 토큰이 있는 Authorization 헤더를 지정했습니다.
  • Bearer 토큰이 생성된 지 1시간이 지나지 않았습니다. 토큰은 1시간 동안만 유효합니다.
  • 올바른 파트너 이름을 지정했습니다 (partner 쿼리 문자열 매개변수 사용). 이 값은 호텔 광고 센터에 표시되는 파트너 이름이 아닌 고유한 파트너 ID입니다. 파트너 ID를 모르는 경우 기술계정 관리자 (TAM)에게 문의하세요.
Not found 엔드포인트의 형식이 잘못되었을 가능성이 높습니다. GET 요청을 제출하는지, 요청 URL이 유효한지, 액세스하려는 API 구문을 준수하는지 확인하세요.
Invalid string value 엔드포인트의 하나 이상의 부분에 잘못된 구문이 포함되어 있습니다. 예를 들어 경로의 일부에 맞춤법이 틀렸을 수 있습니다. 전체 경로에 밑줄, 대소문자, 문구를 올바르게 사용했는지 확인합니다.
Unsupported output format 이 오류는 Reports API를 사용할 때 가장 흔히 발생합니다. GET 요청의 URL에 "alt=csv"를 지정해야 합니다. Reports API는 JSON을 지원하지 않습니다.
AccessTokenRefreshError/Invalid grant 샘플 Python 앱을 실행할 때 이 오류는 다음과 같은 이유로 발생할 수 있습니다.
  • 서비스 계정 이메일 주소가 잘못되었습니다. Google Developer Console에서 이메일 계정을 확인하고 API 액세스 권한이 있는지 확인합니다.
  • 이메일 주소에 API 액세스 권한이 없습니다. 이메일 주소에 호텔 데이터에 액세스할 수 있는 권한이 있는지 확인합니다 (Hotel Center를 통해 공유).
  • 키 파일이 서비스 계정에 맞는 파일이 아닙니다. DevConsole을 사용하여 새 .p12 인증서를 다운로드하고 Python 앱이 올바른 인증서를 가리키는지 확인합니다.
HotelAdsAPIConnection object has no attribute credentials 샘플 Python 앱을 실행할 때 .p12 파일의 경로가 잘못되었습니다.
Invalid scope 샘플 Python 앱을 실행할 때 API 범위는 https://www.googleapis.com/auth/travelpartner이어야 합니다.
Forbidden 사용하는 계정 ID가 액세스 권한이 없는 계정 ID입니다. 하위 계정 소유자인 경우 상위 계정 또는 루트 계정 ID에 액세스하지 못할 수 있습니다.