本文档提供分步说明,介绍如何在访问酒店 API(例如 Travel Partner API 和 Price Feeds API)时在应用中设置 OAuth2.0。请参阅使用 OAuth 2.0 访问 Google API,以授权您的应用。
OAuth 2.0 设置
OAuth 2.0 要求您使用与 Google 账号关联的服务账号来表明自己的身份。服务账号会发送您的私钥,以换取 OAuth 2.0 访问令牌。然后,您可以在对酒店 API 的调用中使用此令牌来获取只读数据,例如酒店价格 Feed 的定价、酒店和诊断报告数据。
访问令牌的有效期为 1 小时(3,600 秒)。
如果您之前实现了 ClientLogin,那么 OAuth 2.0 方法与之类似,但存在以下区别:
- 您的应用使用 Google 服务账号来访问 API。
- 调用 API 时,您需要在
AuthorizationHTTP 标头中传递 OAuth 2.0 访问令牌。
如需设置您的账号以将 OAuth 2.0 与任何 Hotels API 搭配使用,请执行以下步骤:
后续几个部分将介绍其中每个步骤。
第 1 步:创建新的 Google Cloud 控制台项目
Google Cloud 控制台用于管理和查看项目所用 Google API 的流量数据、身份验证和结算信息。
在 Google Cloud 控制台中,项目是您正在处理的应用(使用 Google Developer API 和 Google Cloud 资源)的一组设置、凭据和元数据。
Google Cloud 控制台还用于生成 API 凭据、激活 API 以及管理与项目关联的团队和结算信息。
如需创建新的 Google Cloud 控制台项目,请执行以下操作:
登录您的 Gmail 账号或 Google 账号。
打开 Google Cloud 控制台。 如果这是您的第一个项目,主视图会显示一个创建项目按钮:
点击创建项目按钮。Google Cloud 控制台会显示新建项目对话框:
在项目名称输入字段中输入新项目的易记名称。在相应字段下方,Google Cloud 控制台会为您生成一个项目 ID,确保该 ID 在所有项目中都是唯一的。例如,如果您输入“My New Project”,Google Cloud 控制台会分配一个类似
my-new-project-266022的 ID。点击创建按钮以创建新项目。
使用导航菜单选择 API 和服务 > 信息中心。
下图显示了 Google Cloud 控制台左上角的导航菜单。系统会显示项目的信息中心视图:
如需了解详情,请参阅创建和管理项目。
第 2 步:创建服务账号并生成其凭据
服务账号用于服务器到服务器的交互,例如 Web 应用与酒店数据之间的交互。
如需创建和配置服务账号,请执行以下操作:
在 Google API 控制台主视图中,点击左侧导航栏中的凭据。Google Cloud 控制台会显示凭据视图。
凭据视图会显示您项目的客户端 ID 和凭据。您的应用在请求 OAuth 2.0 访问令牌时会使用该客户端 ID。新项目尚无任何客户端或凭据。
点击 API 和服务中的凭据链接。
点击创建凭据按钮,然后从过滤条件中选择服务账号密钥。系统会显示创建服务账号密钥视图。
从服务账号过滤条件中,选择新的服务账号。
输入服务账号名称和服务账号 ID。
名称可以随意设置,但账号 ID 在所有项目中必须是唯一的。Google Cloud 控制台会根据您输入的名称为您生成一个唯一的账号 ID。
选择 JSON 作为密钥类型。必须提供 JSON。
点击创建按钮。Google Cloud 控制台会为您的项目生成私钥/公钥对。私钥会保存到浏览器存储下载内容的默认位置。您必须下载
.JSON格式的文件。您可以在脚本或访问 API 的其他应用中使用私钥。
Google Cloud 控制台会在完成密钥生成后显示“服务账号已创建”消息。
点击好的,知道了按钮。Google Cloud 控制台会将您返回到凭据视图。如需确认服务账号的详细信息并查看与项目关联的服务账号,请点击此视图中的管理服务账号。
该服务账号现在已关联以下凭据:
- 客户端 ID:您的应用在请求 OAuth 2.0 访问令牌时使用的唯一标识符。
- 电子邮件地址:服务账号的生成电子邮件地址,格式为“account_name@project_name.google.com.iam.gserviceaccount.com”。
- 证书指纹:您下载的私钥的 ID。
如需了解详情,请参阅针对服务器对服务器应用使用 OAuth 2.0。
第 3 步:向服务账号授予对 Hotel Center 数据的访问权限
最后一步是向新服务账号授予对 Hotel Center 的访问权限。服务账号由您在上一步中创建的生成的电子邮件地址标识。您可以使用 Hotel Center 共享设置来授予对相应账号的访问权限。
如果您没有适当的权限来向账号添加用户,请使用联系我们表单与 Google 酒店团队联系,并请求为您的账号设置所有权。您可以请求向所有者发送一封或多封电子邮件。 如需详细了解 Hotel Center 访问权限,请参阅将 Hotel Center 与 Google Ads 相关联。
如需向服务账号授予对您 Hotel Center 数据的访问权限,请执行以下操作:
在新浏览器窗口中,打开酒店中心。
在 Google 酒店中心横幅上,点击“添加用户”图标以打开“分享”对话框。
在添加更多用户字段中,输入要添加到 Hotel Center 的服务账号的电子邮件地址。
保持通知用户选项处于选中状态。
从过滤条件中选择管理。
点击邀请按钮。
将用户添加到 Hotel Center 后,您的服务账号应会在大约 24 小时内获得 API 访问权限。
Google 通知您服务账号已启用 API 访问权限后,您就可以开始使用 OAuth 2.0 访问该 API 了。
如何使用 OAuth 2.0
如需访问该 API,您的应用必须使用服务账号生成的电子邮件地址和私钥向 Google 证明自己的身份。Google 的身份验证机制会将此密钥交换为 OAuth 2.0 访问令牌,您可以在应用的 API 调用中通过 Authorization 标头传递此令牌。
请参阅准备进行委托的 API 调用。
范围
以下是 Hotels API 的 SCOPES:
Travel Partner API:"https://www.googleapis.com/auth/travelpartner"
Price Feeds API:"https://www.googleapis.com/auth/travel-partner-price-upload"
您应在创建凭据时指定服务账号。请参阅创建服务账号并生成其凭据。
在开发应用时,请务必遵循最佳实践,使用 API 密钥对应用进行身份验证。了解详情。
示例
from google.oauth2 import service_account
from google.auth.transport.requests import Request
# You can use a single or multiple scopes
SCOPES =
['https://www.googleapis.com/auth/travel-partner-price-upload','https://www.googleapis.com/auth/travelpartner']
SERVICE_ACCOUNT_FILE = 'service_account_key_file.json'
cred = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE,
scopes=SCOPES)
cred.refresh(Request())
headers = {}
cred.apply(headers)
Travel Partner API
借助 Travel Partner API,住宿合作伙伴可以检索 Hotel Center 信息并更改 Hotel Center 数据,从而管理大型或复杂的账号。
按照 OAUTH 2.0 设置说明操作,以获取 Travel Partner API 的授权。
为 Travel Partners API 创建新项目时,您需要为新的 Google Cloud 控制台项目启用访问权限。
请按照以下步骤操作,以启用对 Travel Partners API 的访问权限:
前往项目的“信息中心”视图。
点击启用 API 和服务。系统会显示 API 库欢迎页面。
在搜索字段中,开始输入“Travel Partner API”,然后控制台会显示与您输入的内容匹配的 API 列表。
点击表格中匹配的 API。Google Cloud 控制台会显示有关该 API 的说明。
点击启用 API 按钮,为您的项目启用此 API。
如需了解详情,请参阅启用和停用服务。
您的 Google 账号的新项目现已启用 Travel Partner API。
Travel Partner API 的范围为:
"https://www.googleapis.com/auth/travelpartner"
Travel Partner API 的端点为:
"https://travelpartner.googleapis.com/v3/accounts/<account_id>/<path>"
Price Feeds API
借助 Price Feeds API,住宿合作伙伴可以为每家酒店提供自定义价格数据。Google 住宿合作伙伴可以使用 OAuth2.0 在向 Google 上传价格时进行身份验证和授权。按照 OAUTH 2.0 设置说明操作,以获取 Price Feeds API 的授权。
注意事项
请注意价格 Feed API 的授权说明存在重要差异。
合作伙伴应按照 OAuth 2.0 设置中提供的相同说明,在 Google Cloud 控制台中创建新的 Price Feeds OAuth2.0 项目。
无需在 Google Cloud 控制台中启用 Price Feeds API,您可以忽略此步骤。您只需要一个服务账号和密钥,然后使用同一服务账号和密钥向价格 Feed 项目授予对 Hotel Center 数据的访问权限。按照 OAuth2.0 设置中提到的其余步骤完成 API 配置。
获取价格 Feed 的 OAuth 2.0 访问令牌
下一步是使用服务账号密钥文件获取具有住宿价格上传范围的 OAuth2.0 访问令牌。您可以按照准备进行委托的 API 调用中提供的说明授权对 Price Feeds 项目的请求,然后从获得的凭据中提取访问令牌,并将其设置在 "Authorization" HTTP 标头中。
住宿价格上传的范围为:
"https://www.googleapis.com/auth/travel-partner-price-upload"
上传价格
获得访问令牌后,合作伙伴可以上传价格 Feed,这与使用静态 IP 进行身份验证和授权类似,但需要进行以下修改:
- 在
"Authorization"HTTP 标头中设置访问令牌
curl -X POST -H "Authorization: Bearer <access token>"
www.google.com/travel/lodging/uploads/accounts/<account_id>/ota/hotel_rate_amount_notif --data-binary @<price_feed_file_location>测试价格 Feed API 的 OAuth2.0 设置
您可以上传空文件或包含实际价格数据的文件到任意上传路径,以测试 OAuth2.0 设置。您可以使用下表查看 HTTP 响应状态。
| HTTP 响应状态 | 消息 |
|---|---|
| 200 | Successful (OK) |
| 401 | Service account creation or access token fetch was not successful |
| 403 | Service account access wasn't granted to the Hotel Center account or both the service account key and access token has expired |
问题排查
遇到问题了?快速检查以下各项内容可能有助于解决问题。
- 您是否已在 Google Cloud 控制台中创建项目?
- 您是否已在项目中启用该服务?
- 您是否在点击创建客户端 ID 并选择服务账号后下载了
.JSON文件(私钥)? - 您是否收到了格式如下的服务账号客户端 ID 电子邮件地址:
nnnnnnn@app_name.google.com.iam.gserviceaccount.com? - 您是否已通过点击分享此账号按钮与服务账号分享了您的 Hotel Ads Center 账号?
- 您是否已将服务账号的电子邮件地址和您的合作伙伴 ID 发送给您的技术支持客户经理 (TAM)?
- 您的 API 调用是否在
Authorization标头中传递了最近获得的令牌? - 您的令牌是否已超过 1 小时?
下表列出了一些常见错误和可能的解决方法:
| 错误 | 说明 |
|---|---|
| Invalid credentials | 这可能意味着多种情况。如果您遇到此错误,请检查以下事项:
|
| Not found | 您的端点很可能格式不正确。检查您是否提交了 GET 请求,以及请求网址是否有效(符合您尝试访问的 API 语法)。 |
| Invalid string value | 端点的一个或多个部分包含无效语法。例如,您可能拼错了路径的某一部分。检查整个路径中使用的下划线、大写字母和措辞是否正确。 |
| Unsupported output format | 此错误最常在使用 Reports API 时出现。您必须在 GET 请求的网址中指定 "alt=csv"。Reports API 不支持 JSON。 |
| AccessTokenRefreshError/Invalid grant | 运行应用时,此错误可能是由以下原因造成的:
|
| HotelAdsAPIConnection object has no attribute credentials | 运行应用时,.JSON 文件的路径不正确。 |
| Invalid scope | 运行应用时,您的 API 范围必须是以下范围之一:
|
| Forbidden | 您使用的账号 ID 是您无权访问的账号 ID。如果您是子账号所有者,可能无法访问父账号或根账号 ID。 |