API の承認

ホテル 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

    [プロジェクト名] 入力フィールドに、新しいプロジェクトのわかりやすい名前を入力します。このフィールドの下に、プロジェクト ID が自動的に生成されます。これにより、すべてのプロジェクトでその ID が一意になります。たとえば、「My New Project」と入力すると、DevConsole によって my-new-project-266022 のような ID が割り当てられます。

  4. [作成] ボタンをクリックして、新しいプロジェクトを作成します。

  5. ナビゲーション メニューで [API とサービス] > [ダッシュボード] を選択します。

    fig3

    次の画像は、DevConsole の左上にあるナビゲーション メニューを示しています。プロジェクトの [ダッシュボード] ビューが表示されます。

    fig4

詳しくは、Play 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 に [認証情報] ビューが表示されます。

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

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

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

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

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

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

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

    fig5

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

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

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

    fig6

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

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

    • クライアント 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 Developers 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 またはルート アカウント ID にアクセスできない可能性があります。