API の承認

Hotel API にアクセスする際は、OAuth 2.0 を使用してアプリケーションを承認します。

OAuth 2.0 のセットアップ

OAuth 2.0 では、Google アカウントに関連付けられたサービス アカウントを使用して本人確認を行う必要があります。サービス アカウントは、OAuth 2.0 アクセス トークンと引き換えに秘密鍵を送信します。このトークンは、宿泊料金フィードに関する料金、ホテル、診断レポートデータなどの読み取り専用データに対する Hotel 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 を開きます。プロジェクトを初めて作成する場合、メインビューにはシンプルな [プロジェクトを作成] ボタンが表示されます。

    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 を有効にする

Hotel API を使用するには、新しい DevConsole プロジェクトで Travel Partner API を有効にする必要があります。

新しいプロジェクトで Hotel API を有効にするには:

  1. 上記の手順でプロジェクトの [ダッシュボード] ビューに移動します。

  2. [API とサービスの有効化] をクリックします。これにより、API ライブラリのスタートページが表示されます。

  3. 検索フィールドに「Travel Partner API」と入力します。Google API Console に、入力した内容に一致する API のリストが表示されます。

  4. 一致する API の表で Travel Partner API をクリックします。DevConsole に API の説明が表示されます。

  5. [API を有効にする] ボタンをクリックして、プロジェクトでこの API を有効にします。

詳細については、API の有効化と無効化をご覧ください。

これで、Google アカウントの新しいプロジェクトで Hotel API が有効になりました。

次に、サービス アカウントを作成し、そのキーを生成します。

ステップ 3: サービス アカウントを作成し、その認証情報を生成する

サービス アカウントは、ウェブ アプリケーションとホテルデータ間のやり取りなど、サーバー間のやり取りで使用されます。

サービス アカウントを作成して構成するには、次の手順を行います。

  1. Google API Console のメインビューで、左側のナビゲーションの [認証情報] をクリックします。DevConsole に [認証情報] ビューが表示されます。

    [認証情報] ビューには、プロジェクトのクライアント ID と認証情報が表示されます。アプリケーションは、OAuth 2.0 アクセス トークンをリクエストするときに、このクライアント ID を使用します。新しいプロジェクトには、まだクライアントや認証情報がありません。

  2. [API とサービスの認証情報] リンクをクリックします。

  3. [認証情報を作成] ボタンをクリックし、プルダウンから [サービス アカウント キー] を選択します。[サービス アカウント キーの作成] ビューが表示されます。

  4. [サービス アカウント] プルダウンから、[新しいサービス アカウント] を選択します。

  5. サービス アカウント名とサービス アカウント ID を入力します。

    名前は任意ですが、アカウント ID はすべてのプロジェクトで一意である必要があります。入力した名前に基づいて、DevConsole によって一意のアカウント ID が生成されます。

  6. 以下に示すように、鍵のタイプとして [P12] を選択します。P12 は必須です

    fig5

  7. [Create] ボタンをクリックします。DevConsole がプロジェクトの秘密鍵と公開鍵のペアを生成します。秘密鍵は、ブラウザがダウンロードを保存するデフォルトの場所に保存されます。.json ファイル形式ではなく、.p12 形式(バイナリ)をダウンロードする必要があります

    秘密鍵は、Travel Partner API にアクセスするスクリプトやその他のアプリケーションで使用します。

    DevConsole にキーの生成が完了すると、次の通知が表示されます。

    fig6

  8. [OK] ボタンをクリックします。DevConsole の [認証情報] ビューに戻ります。サービス アカウントの詳細を確認し、プロジェクトに関連付けられたサービス アカウントを表示するには、このビューで [サービス アカウントを管理] をクリックします。

    これで、サービス アカウントに次の認証情報が関連付けられました。

    • クライアント ID: OAuth 2.0 アクセス トークンをリクエストするときにアプリケーションが使用する一意の識別子。
    • メールアドレス: サービス アカウント用に生成されたメールアドレス。形式は "account_nameaccount_name@account_name.google.com.iam.gserviceaccount.com です。
    • 証明書フィンガープリント: ダウンロードした秘密鍵の ID。

詳細については、サーバー間アプリケーションに OAuth 2.0 を使用するをご覧ください。

ステップ 4: サービス アカウントに Hotel Center データへのアクセス権を付与する

最後に、新しいサービス アカウントに Hotel Center へのアクセス権を付与します。サービス アカウントは、前の手順で作成した生成されたメールアドレスで識別されます。このアカウントへのアクセス権は、Hotel Center の共有設定で付与します。

サービス アカウントに Hotel Center のデータへのアクセス権を付与するには:

アカウントにユーザーを追加するための適切なアクセス権がない場合は、お問い合わせフォームを使用して Google ホテルチームに連絡し、アカウントのオーナー権限の設定を Google にリクエストしてください。オーナー宛てにメールを送信するようリクエストできます(複数可)。 Hotel Center へのアクセスについて詳しくは、Hotel Center と Google 広告をリンクするをご覧ください。

  1. 新しいブラウザ ウィンドウで、Hotel Center を開きます。 fig7

  2. [Hotel Center by Google] バナーで、ユーザー追加アイコンをクリックして共有ダイアログを開きます。

    fig8

  3. [ユーザーを追加] フィールドに、Hotel Center に追加するサービス アカウントのメールアドレスを入力します。

  4. [通知] オプションを選択したままにします。

  5. プルダウン メニューから [管理] を選択します。

  6. [招待] ボタンをクリックします。

  7. Hotel Center にユーザーを追加すると、約 24 時間以内にサービス アカウントの API アクセスが有効になります。

サービス アカウントで API アクセスが有効になったことを Google が通知したら、OAuth を使用して API へのアクセスを開始できます。

OAuth 2.0 の使用

API にアクセスするには、サービス アカウントで生成されたメールアドレスと秘密鍵を使用して、アプリケーションが Google に対してアプリケーションを識別する必要があります。Google の認証メカニズムでは、このキーを OAuth 2.0 アクセス トークンと交換し、アプリの API 呼び出しの Authorization ヘッダーで渡します。

アクセス トークン(署名なしトークンとも呼ばれます)は 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 ヘッダーの署名なしトークンを出力します。

$ 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. [このアカウントを共有] ボタンをクリックして、Hotel Ads Center アカウントをサービス アカウントと共有しましたか?
  6. サービス アカウントのメールアドレスとパートナー ID をテクニカル アカウント マネージャー(TAM)に送信しましたか?
  7. Travel Partner API の呼び出しでは、最近取得したトークンを Authorization ヘッダーで渡していますか。
  8. Authorization ヘッダーの署名なしトークンから 1 時間以上経過していますか?

次の表に、一般的なエラーと可能な解決策を示します。

エラー 説明
Invalid credentials さまざまな原因が考えられます。このエラーが発生した場合は、次の点を確認してください。
  • 有効な署名なしトークンを含む Authorization ヘッダーを指定した。
  • 署名なしトークンが生成後 1 時間未満。トークンは 1 時間のみ有効です。
  • 正しいパートナー名を指定した(partner クエリ文字列パラメータ)。値は一意のパートナー ID です。Hotel Ads Center に表示されるパートナー名ではありません。パートナー ID がわからない場合は、テクニカル アカウント マネージャー(TAM)にお問い合わせください。
Not found エンドポイントの形式が正しくない可能性があります。GET リクエストを送信していること、リクエスト URL が有効であること(アクセスしようとしている API 構文に準拠していること)を確認します。
Invalid string value エンドポイントの 1 つ以上の部分に無効な構文が含まれています。たとえば、パスの一部にスペルミスがある可能性があります。パス全体で、正しいアンダースコア、大文字アルファベットの使用方法、表現が使用されていることを確認してください。
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 または root アカウント ID にアクセスできない場合があります。