Используйте 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 , выполните следующие действия:
Создайте новый проект в консоли разработчиков Google (DevConsole).
Предоставьте своему сервисному аккаунту доступ к данным вашего отеля.
Каждый из этих шагов описан в следующих разделах.
Шаг 1. Создайте новый проект DevConsole.
Консоль разработчиков Google («DevConsole») — это инструмент Google для разработчиков, предназначенный для управления и просмотра данных о трафике, аутентификации и платежной информации для API Google, которые используются в ваших проектах.
В DevConsole проект — это набор настроек, учетных данных и метаданных о приложении или приложениях, над которыми вы работаете и которые используют Google Developer API и ресурсы Google Cloud.
DevConsole — это место, где вы управляете такими аспектами вашего проекта, как создание учетных данных API, активация API, а также управление командой и платежной информацией, связанной с вашим проектом.
Чтобы создать новый проект DevConsole:
Войдите в свою учетную запись Gmail/Google.
Откройте консоль разработчика Google . Если это ваш первый проект, в главном представлении отображается простая кнопка СОЗДАТЬ ПРОЕКТ :
Нажмите кнопку СОЗДАТЬ ПРОЕКТ . DevConsole отображает диалоговое окно «Новый проект» :
Введите понятное имя для вашего нового проекта в поле ввода «Имя проекта» . Под этим полем DevConsole генерирует для вас идентификатор проекта, гарантируя, что этот идентификатор уникален для всех проектов. Например, если вы введете «Мой новый проект», DevConsole присвоит идентификатор, например
my-new-project-266022
.Нажмите кнопку «Создать» , чтобы создать новый проект.
В меню навигации выберите API и службы > Панель мониторинга .
На изображении ниже показано меню навигации в левом верхнем углу DevConsole. Отобразится представление панели мониторинга вашего проекта:
Дополнительную информацию см. в разделе Управление проектами в консоли разработчика .
Когда вы создаете новый проект, с ним еще не связаны API. На следующем шаге вы активируете Travel Partner API для своего нового проекта.
Шаг 2. Включите Travel Partner API для нового проекта.
Чтобы использовать API-интерфейсы отелей, необходимо включить Travel Partner API в новом проекте DevConsole.
Чтобы включить API отеля для вашего нового проекта:
Перейдите к панели мониторинга вашего проекта, как описано выше.
Нажмите «Включить API и службы» . Откроется страница приветствия библиотеки API.
В поле поиска начните вводить Travel Partner API . Консоль API Google отображает список API, которые соответствуют введенному вами значению.
Нажмите Travel Partner API в таблице соответствующих API. DevConsole отображает описание API.
Нажмите кнопку «Включить API» , чтобы включить этот API для вашего проекта.
Дополнительную информацию см. в разделе Активация и деактивация API .
API-интерфейсы отелей теперь включены для нового проекта вашего аккаунта Google.
Следующий шаг — создать сервисную учетную запись и сгенерировать для нее ключи.
Шаг 3. Создайте учетную запись службы и сгенерируйте ее учетные данные.
Учетные записи служб используются при межсерверном взаимодействии, например между веб-приложением и данными вашего отеля.
Чтобы создать и настроить учетную запись службы:
В главном представлении консоли Google API нажмите «Учетные данные» на панели навигации слева. DevConsole отображает представление учетных данных .
В представлении «Учетные данные» отображаются идентификаторы клиентов и учетные данные для вашего проекта. Ваше приложение будет использовать идентификатор клиента при запросе токена доступа OAuth 2.0. У новых проектов пока не будет ни клиентов, ни учетных данных.
Нажмите ссылку «Учетные данные в API и службах» .
Нажмите кнопку «Создать учетные данные» и выберите «Ключ учетной записи службы» в раскрывающемся списке. Откроется представление ключа создания учетной записи службы .
В раскрывающемся списке «Учетная запись службы» выберите «Новая учетная запись службы» .
Введите имя учетной записи службы и идентификатор учетной записи службы.
Имя может быть любым, но идентификатор учетной записи должен быть уникальным во всех проектах. DevConsole сгенерирует для вас уникальный идентификатор учетной записи на основе введенного вами имени.
Выберите P12 в качестве типа ключа, как показано ниже. Требуется P12 .
Нажмите кнопку «Создать» . DevConsole генерирует пару частного/открытого ключей для вашего проекта. Закрытый ключ сохраняется в папке по умолчанию, в которой ваш браузер сохраняет загрузки. Вам необходимо загрузить формат
.p12
(двоичный), а не формат файла.json
.Вы используете закрытый ключ в своих скриптах или других приложениях, которые получают доступ Travel Partner API .
DevConsole отображает следующее уведомление после завершения генерации ключей:
Нажмите кнопку ОК, понятно . 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 .
В новом окне браузера откройте Hotel Center .
На баннере Hotel Center by Google щелкните значок добавления пользователя, чтобы открыть диалоговое окно общего доступа.
В поле «Добавить больше людей» введите адрес электронной почты сервисной учетной записи, которую вы хотите добавить в свой Hotel Center .
Оставьте выбранной опцию «Уведомить людей» .
В раскрывающемся меню выберите «Управление» .
Нажмите кнопку «Пригласить» .
После того как вы добавите пользователей в свой 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 часа после его создания.
Поиск неисправностей
Возникли проблемы? Быстрая проверка следующих элементов может решить проблему.
- Вы создали проект в консоли разработчика Google ?
- Вы нашли и включили Travel Partner API ?
- Загрузили ли вы файл
.p12
— закрытый ключ после нажатия кнопки «Создать идентификатор клиента» и выбора учетной записи службы ? - Получили ли вы адрес электронной почты с идентификатором клиента сервисного аккаунта в форме:
nnnnnnn@app_name.google.com.iam.gserviceaccount.com
? - Вы предоставили доступ к своему аккаунту Hotel Ads Center сервисному аккаунту, нажав кнопку «Поделиться этим аккаунтом» ?
- Отправили ли вы адрес электронной почты сервисного аккаунта и идентификатор партнера своему техническому менеджеру по работе с клиентами (TAM)?
- Передаются ли вызовы Travel Partner API недавно полученного токена в заголовке
Authorization
? - Токену носителя заголовка
Authorization
больше 1 часа?
В следующей таблице перечислены некоторые распространенные ошибки и возможные решения:
Ошибка | Описание |
---|---|
Invalid credentials | Это может означать несколько вещей. Если вы столкнулись с этой ошибкой, проверьте следующее:
|
Not found | Ваша конечная точка, скорее всего, неправильно сформирована. Убедитесь, что вы отправляете запрос GET и что URL-адрес запроса действителен (он соответствует синтаксису API, к которому вы пытаетесь получить доступ). |
Invalid string value | Одна или несколько частей конечной точки содержат недопустимый синтаксис. Например, вы могли неправильно написать часть пути. Убедитесь, что вы использовали правильные символы подчеркивания, заглавные буквы и формулировки на протяжении всего пути. |
Unsupported output format | Эта ошибка чаще всего возникает при использовании API отчетов. Вы должны указать "alt=csv" в URL-адресе вашего запроса GET . API отчетов не поддерживает JSON. |
AccessTokenRefreshError/Invalid grant | При запуске примера приложения Python эта ошибка может быть вызвана следующими причинами:
|
HotelAdsAPIConnection object has no attribute credentials | При запуске примера приложения Python указан неверный путь к файлу .p12 . |
Invalid scope | При запуске примера приложения Python область действия API должна быть https://www.googleapis.com/auth/travelpartner . |
Forbidden | Используемый вами идентификатор учетной записи не имеет разрешения на доступ. Если вы являетесь владельцем дополнительной учетной записи, возможно, вы не сможете получить доступ к идентификатору родительской или корневой учетной записи. |