Авторизация API

Используйте OAuth 2.0 для авторизации вашего приложения при доступе к API отеля.

Настройка OAuth 2.0

OAuth 2.0 требует, чтобы вы идентифицировали себя, используя учетную запись службы, связанную с вашей учетной записью Google. Учетная запись службы отправляет ваш закрытый ключ в обмен на токен доступа OAuth 2.0. Затем вы можете использовать этот токен при вызовах API-интерфейсов отеля для получения данных только для чтения , таких как данные о ценах, отеле и диагностические отчеты о фиде цен на ваш отель.

Токены доступа действительны в течение часа (3600 секунд).

Если вы ранее реализовали ClientLogin, подход OAuth 2.0 аналогичен, но со следующими отличиями:

  • Ваше приложение использует учетную запись службы Google для доступа к API.
  • Вы передаете токен доступа OAuth 2.0 в HTTP-заголовке Authorization при вызове API.

Чтобы настроить свою учетную запись для использования OAuth 2.0 с Travel Partner API , выполните следующие действия:

  1. Создайте новый проект в консоли разработчиков Google (DevConsole).

  2. Включите доступ к Travel Partner API для нового проекта.

  3. Создайте учетную запись службы и ее учетные данные.

  4. Предоставьте своему сервисному аккаунту доступ к данным вашего отеля.

Каждый из этих шагов описан в следующих разделах.

Шаг 1. Создайте новый проект DevConsole.

Консоль разработчиков Google («DevConsole») — это инструмент Google для разработчиков, предназначенный для управления и просмотра данных о трафике, аутентификации и платежной информации для API Google, которые используются в ваших проектах.

В DevConsole проект — это набор настроек, учетных данных и метаданных о приложении или приложениях, над которыми вы работаете и которые используют Google Developer API и ресурсы Google Cloud.

DevConsole — это место, где вы управляете такими аспектами вашего проекта, как создание учетных данных API, активация API, а также управление командой и платежной информацией, связанной с вашим проектом.

Чтобы создать новый проект DevConsole:

  1. Войдите в свою учетную запись Gmail/Google.

  2. Откройте консоль разработчика Google . Если это ваш первый проект, в главном представлении отображается простая кнопка СОЗДАТЬ ПРОЕКТ :

    рисунок 1

  3. Нажмите кнопку СОЗДАТЬ ПРОЕКТ . DevConsole отображает диалоговое окно «Новый проект» :

    рис2

    Введите понятное имя для вашего нового проекта в поле ввода «Имя проекта» . Под этим полем DevConsole генерирует для вас идентификатор проекта, гарантируя, что этот идентификатор уникален для всех проектов. Например, если вы введете «Мой новый проект», DevConsole присвоит идентификатор, например my-new-project-266022 .

  4. Нажмите кнопку «Создать» , чтобы создать новый проект.

  5. В меню навигации выберите API и службы > Панель мониторинга .

    рис3

    На изображении ниже показано меню навигации в левом верхнем углу DevConsole. Отобразится представление панели мониторинга вашего проекта:

    рис4

Дополнительную информацию см. в разделе Управление проектами в консоли разработчика .

Когда вы создаете новый проект, с ним еще не связаны API. На следующем шаге вы активируете Travel Partner API для своего нового проекта.

Шаг 2. Включите Travel Partner API для нового проекта.

Чтобы использовать API-интерфейсы отелей, необходимо включить Travel Partner API в новом проекте DevConsole.

Чтобы включить API отеля для вашего нового проекта:

  1. Перейдите к панели мониторинга вашего проекта, как описано выше.

  2. Нажмите «Включить API и службы» . Откроется страница приветствия библиотеки API.

  3. В поле поиска начните вводить Travel Partner API . Консоль API Google отображает список API, которые соответствуют введенному вами значению.

  4. Нажмите Travel Partner API в таблице соответствующих API. DevConsole отображает описание API.

  5. Нажмите кнопку «Включить API» , чтобы включить этот API для вашего проекта.

Дополнительную информацию см. в разделе Активация и деактивация API .

API-интерфейсы отелей теперь включены для нового проекта вашего аккаунта Google.

Следующий шаг — создать сервисную учетную запись и сгенерировать для нее ключи.

Шаг 3. Создайте учетную запись службы и сгенерируйте ее учетные данные.

Учетные записи служб используются при межсерверном взаимодействии, например между веб-приложением и данными вашего отеля.

Чтобы создать и настроить учетную запись службы:

  1. В главном представлении консоли Google API нажмите «Учетные данные» на панели навигации слева. DevConsole отображает представление учетных данных .

    В представлении «Учетные данные» отображаются идентификаторы клиентов и учетные данные для вашего проекта. Ваше приложение будет использовать идентификатор клиента при запросе токена доступа OAuth 2.0. У новых проектов пока не будет ни клиентов, ни учетных данных.

  2. Нажмите ссылку «Учетные данные в API и службах» .

  3. Нажмите кнопку «Создать учетные данные» и выберите «Ключ учетной записи службы» в раскрывающемся списке. Откроется представление ключа создания учетной записи службы .

  4. В раскрывающемся списке «Учетная запись службы» выберите «Новая учетная запись службы» .

  5. Введите имя учетной записи службы и идентификатор учетной записи службы.

    Имя может быть любым, но идентификатор учетной записи должен быть уникальным во всех проектах. DevConsole сгенерирует для вас уникальный идентификатор учетной записи на основе введенного вами имени.

  6. Выберите P12 в качестве типа ключа, как показано ниже. Требуется P12 .

    рис5

  7. Нажмите кнопку «Создать» . DevConsole генерирует пару частного/открытого ключей для вашего проекта. Закрытый ключ сохраняется в папке по умолчанию, в которой ваш браузер сохраняет загрузки. Вам необходимо загрузить формат .p12 (двоичный), а не формат файла .json .

    Вы используете закрытый ключ в своих скриптах или других приложениях, которые получают доступ к Travel Partner API .

    DevConsole отображает следующее уведомление после завершения генерации ключей:

    рис6

  8. Нажмите кнопку ОК, понятно . DevConsole возвращает вас в представление учетных данных . Чтобы подтвердить сведения о своей учетной записи службы и просмотреть учетные записи служб, связанные с вашим проектом, нажмите «Управление учетными записями служб» в этом представлении.

    Теперь с учетной записью службы связаны следующие учетные данные:

    • Идентификатор клиента: уникальный идентификатор, который ваше приложение использует при запросе токена доступа OAuth 2.0.
    • Адрес электронной почты: сгенерированный адрес электронной почты для учетной записи службы в форме " имя_аккаунта @ имя_проекта .google.com.iam.gserviceaccount.com".
    • Отпечатки сертификата: идентификатор загруженного вами закрытого ключа.

Дополнительную информацию см. в разделе Использование OAuth 2.0 для межсерверных приложений .

Шаг 4. Предоставьте сервисному аккаунту доступ к данным вашего Hotel Center.

Последний шаг — предоставить новому сервисному аккаунту доступ к вашему Hotel Center . Учетная запись службы идентифицируется по сгенерированному адресу электронной почты, который вы создали на предыдущем шаге. Вы предоставляете доступ к этой учетной записи, используя настройки общего доступа Hotel Center .

Чтобы предоставить сервисному аккаунту доступ к данным вашего Hotel Center:

Если у вас нет надлежащего доступа для добавления пользователей в учетную запись, свяжитесь с командой Google Hotels, используя форму обратной связи , и попросите нас настроить право собственности на вашу учетную запись. Вы можете запросить отправку владельцу одного или нескольких электронных писем. Дополнительную информацию о доступе к Hotel Center см. в разделе Link Hotel Center и Google Ads .

  1. В новом окне браузера откройте Hotel Center .рис7

  2. На баннере Hotel Center by Google щелкните значок добавления пользователя, чтобы открыть диалоговое окно общего доступа.

    рис8

  3. В поле «Добавить больше людей » введите адрес электронной почты сервисной учетной записи, которую вы хотите добавить в свой Hotel Center .

  4. Оставьте выбранной опцию «Уведомить людей» .

  5. В раскрывающемся меню выберите «Управление» .

  6. Нажмите кнопку «Пригласить» .

  7. После того как вы добавите пользователей в свой Hotel Center , вашему сервисному аккаунту будет предоставлен доступ к API в течение примерно 24 часов.

После того как Google уведомит вас о том, что доступ к API включен для вашей учетной записи службы, вы можете начать получать доступ к API с помощью OAuth.

Использование OAuth 2.0

Чтобы получить доступ к API, ваше приложение должно идентифицировать себя в Google с помощью сгенерированного адресом электронной почты и секретным ключом учетной записи службы. Механизм аутентификации Google заменяет этот ключ на токен доступа OAuth 2.0, который вы передаете в заголовке Authorization в вызовах API вашего приложения.

Токены доступа (также известные как токены на предъявителя ) являются частью стандарта OAuth 2.0. Синтаксис указания токена доступа в заголовке HTTP:

Authorization: Bearer *oauth2_access_token*

В следующем примере показаны примеры HTTP-заголовков запроса, который обращается к API отчетов:

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. Затем вы сможете использовать этот токен в заголовках Authorization ваших запросов при доступе к Travel Partner API .

#!/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 ?
  2. Вы нашли и включили Travel Partner API ?
  3. Загрузили ли вы файл .p12 — закрытый ключ после нажатия кнопки «Создать идентификатор клиента» и выбора учетной записи службы ?
  4. Получили ли вы адрес электронной почты с идентификатором клиента сервисного аккаунта в форме: nnnnnnn@app_name.google.com.iam.gserviceaccount.com ?
  5. Вы предоставили доступ к своему аккаунту Hotel Ads Center сервисному аккаунту, нажав кнопку «Поделиться этим аккаунтом» ?
  6. Отправили ли вы адрес электронной почты сервисного аккаунта и идентификатор партнера своему техническому менеджеру по работе с клиентами (TAM)?
  7. Передаются ли вызовы Travel Partner API недавно полученного токена в заголовке Authorization ?
  8. Токену носителя заголовка Authorization больше 1 часа?

В следующей таблице перечислены некоторые распространенные ошибки и возможные решения:

Ошибка Описание
Invalid credentials Это может означать несколько вещей. Если вы столкнулись с этой ошибкой, проверьте следующее:
  • Вы указали заголовок Authorization с действительным токеном носителя.
  • Токену на предъявителя меньше часа. Токен действителен только в течение одного часа.
  • Вы указали правильное имя партнера (с параметром строки запроса partner ). Значением является ваш уникальный идентификатор партнера, а не имя партнера, которое отображается в Центре рекламы отелей . Если вы не знаете свой идентификатор партнера, обратитесь к своему техническому менеджеру по работе с клиентами (TAM).
Not found Ваша конечная точка, скорее всего, неправильно сформирована. Убедитесь, что вы отправляете запрос GET и что URL-адрес запроса действителен (он соответствует синтаксису API, к которому вы пытаетесь получить доступ).
Invalid string value Одна или несколько частей конечной точки содержат недопустимый синтаксис. Например, вы могли неправильно написать часть пути. Убедитесь, что вы использовали правильные символы подчеркивания, заглавные буквы и формулировки на протяжении всего пути.
Unsupported output format Эта ошибка чаще всего возникает при использовании API отчетов. Вы должны указать "alt=csv" в URL-адресе вашего запроса GET . API отчетов не поддерживает JSON.
AccessTokenRefreshError/Invalid grant При запуске примера приложения Python эта ошибка может быть вызвана следующими причинами:
  • Адрес электронной почты вашего сервисного аккаунта неверен. Проверьте учетную запись электронной почты в консоли разработчика Google и убедитесь, что ей разрешен доступ к 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 Используемый вами идентификатор учетной записи не имеет разрешения на доступ. Если вы являетесь владельцем дополнительной учетной записи, возможно, вы не сможете получить доступ к идентификатору родительской или корневой учетной записи.