API 授权

本文档提供了有关在访问酒店 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 时,您需要在 Authorization HTTP 标头中传递 OAuth 2.0 访问令牌。

如需将您的账号设置为使用 OAuth 2.0 与任何 Hotels API 搭配使用,请执行以下步骤:

  1. 在 Google Cloud 控制台中创建新项目

  2. 创建一个服务账号及其凭据

  3. 向服务账号授予对酒店数据的访问权限

后续几个部分将介绍其中每个步骤。

第 1 步:创建新的 Google Cloud 控制台项目

Google Cloud 控制台用于管理和查看项目使用的 Google API 的流量数据、身份验证和结算信息。

在 Google Cloud 控制台中,项目是指与您正在使用的应用(该应用使用 Google Developer API 和 Google Cloud 资源)相关的一系列设置、凭据和元数据。

Google Cloud 控制台还用于生成 API 凭据、激活 API,以及管理与您的项目关联的团队和结算信息。

如需创建新的 Google Cloud 控制台项目,请执行以下操作:

  1. 登录您的 Gmail 或 Google 账号。

  2. 打开 Google Cloud 控制台。如果这是您的第一个项目,主视图会显示一个创建项目按钮:

    fig1

  3. 点击创建项目按钮。Google Cloud 控制台会显示新建项目对话框:

    fig2

    项目名称输入字段中输入新项目的易记名称。Google Cloud 控制台会在该字段下为您生成项目 ID,确保该 ID 在所有项目中都是唯一的。例如,如果您输入“My New Project”,Google Cloud 控制台会分配一个 ID,例如 my-new-project-266022

  4. 点击创建按钮以创建新项目。

  5. 使用导航菜单依次选择 API 和服务 > 信息中心

    fig3

    下图显示了 Google Cloud 控制台左上角的导航菜单。系统随即会显示项目的信息中心视图:

    fig4

如需了解详情,请参阅创建和管理项目

第 2 步:创建服务账号并生成其凭据

服务账号用于服务器到服务器交互,例如 Web 应用与酒店数据之间的交互。

如需创建和配置服务账号,请执行以下操作:

  1. 在 Google API 控制台主视图中,点击左侧导航栏中的凭据。Google Cloud 控制台会显示凭据视图。

    凭据视图会显示项目的客户端 ID 和凭据。您的应用在请求 OAuth 2.0 访问令牌时会使用该客户端 ID。新项目还没有任何客户端或凭据。

  2. 点击 API 和服务中的凭据链接。

  3. 点击创建凭据按钮,然后从过滤条件中选择服务账号密钥。系统会显示创建服务账号密钥视图。

  4. 服务账号过滤条件中,选择新的服务账号

  5. 输入服务账号名称和服务账号 ID。

    名称可以是您想要的任何名称,但账号 ID 在所有项目中都必须是唯一的。Google Cloud 控制台会根据您输入的名称为您生成一个唯一的账号 ID。

  6. 选择 JSON 作为密钥类型。必须使用 JSON

  7. 点击创建按钮。Google Cloud 控制台会为您的项目生成私钥或公钥对。私钥会保存到浏览器存储下载内容的默认位置。您必须下载 .JSON 格式文件

    您可以在脚本或访问您的 API 的其他应用中使用私钥。

    Google Cloud 控制台在完成密钥生成后会显示“已创建服务账号”消息。

  8. 点击 OK, got it 按钮。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 数据的访问权限,请执行以下操作:

  1. 在新的浏览器窗口中,打开 Hotel Centerfig7

  2. Hotel Center by Google 横幅上,点击“添加用户”图标以打开共享对话框。

    fig8

  3. 添加更多人员字段中,输入您要添加到 Hotel Center 的服务账号的电子邮件地址。

  4. 保持通知用户选项处于选中状态。

  5. 从过滤条件中选择管理

  6. 点击邀请按钮。

  7. Hotel Center 添加用户后,您的服务账号应该会在大约 24 小时内获得 API 访问权限。

在 Google 通知您已为您的服务账号启用 API 访问权限后,您就可以开始使用 OAuth 2.0 访问该 API 了。

如何使用 OAuth 2.0

如需访问该 API,您的应用必须使用服务账号生成的电子邮件地址和私钥向 Google 证明自己的身份。Google 的身份验证机制会将此密钥交换为您在应用的 API 调用中通过 Authorization 标头传递的 OAuth 2.0 访问令牌。

请参阅准备进行委托 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 的访问权限:

  1. 前往项目的信息中心视图。

  2. 点击启用 API 和服务。系统随即会显示 API 库欢迎页面。

  3. 在搜索字段中,开始输入“Travel Partner API”,然后控制台会显示与您输入内容匹配的 API 列表。

  4. 点击表格中匹配的 API。Google Cloud 控制台会显示该 API 的说明。

  5. 点击 Enable 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 住宿合作伙伴在向 Google 上传价格时,可以使用 OAuth2.0 对自己进行身份验证和授权。按照 OAUTH 2.0 设置说明获取 Price Feeds API 的授权。

注意事项

请注意 Price Feeds API 授权说明中的重大差异。

  1. 合作伙伴应按照 OAuth 2.0 设置中提供的说明,在 Google Cloud 控制台中创建新的价格 Feed OAuth2.0 项目

  2. 在 Google Cloud 控制台中启用 Price Feeds API NOT必需,可以忽略。您只需一个服务账号和密钥,然后使用同一服务账号和密钥向价格 Feed 项目授予对 Hotel Center 数据的访问权限。按照 OAuth2.0 设置中提到的其余步骤,完成 API 配置。

获取价格 Feed 的 OAuth2.0 访问令牌

下一步是使用服务账号密钥文件获取具有住宿价格上传范围的 OAuth2.0 访问令牌。您可以按照准备进行委托 API 调用中的说明授权对价格 Feed 项目的请求,然后从获取的凭据中提取访问令牌并将其设置在 "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>

测试 Price Feeds 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

问题排查

遇到问题了?快速检查以下各项可能有助于解决问题。

  1. 您是否在 Google Cloud 控制台中创建了项目?
  2. 您是否已在项目中启用该服务?
  3. 在点击创建客户端 ID 并选择服务账号后,您是否下载了 .JSON 文件(私钥)?
  4. 您是否收到了格式为 nnnnnnn@app_name.google.com.iam.gserviceaccount.com 的服务账号客户 ID 电子邮件地址?
  5. 您是否已点击共享此账号按钮,与服务账号共享了 Hotel Ads Center 账号?
  6. 您是否已向您的技术支持客户经理 (TAM) 发送服务账号的电子邮件地址和您的合作伙伴 ID?
  7. 您的 API 调用是否在 Authorization 标头中传递最近获取的令牌?
  8. 您的令牌是否已超过 1 小时?

下表列出了一些常见错误和可能的解决方法:

错误 说明
Invalid credentials 这可能有多种原因。如果您遇到此错误,请检查以下事项:
  • 您指定了包含有效不记名令牌的 Authorization 标头。
  • 令牌有效期不到 1 小时。令牌的有效期只有 1 小时。
  • 您已指定正确的合作伙伴名称(使用 partner 查询字符串参数)。此值是您的唯一合作伙伴 ID,而不是 Hotel Ads Center 中显示的合作伙伴名称。如果您不知道自己的合作伙伴 ID,请与您的技术支持客户经理 (TAM) 联系。
Not found 您的端点很可能格式有误。检查您是否正在提交 GET 请求,以及请求网址是否有效(是否符合您尝试访问的 API 语法)。
Invalid string value 端点的一个或多个部分包含无效的语法。例如,您可能拼错了路径的某个部分。检查您在整个路径中是否使用了正确的下划线、大小写和用词。
Unsupported output format 此错误最常在使用 Reports API 时出现。您必须在 GET 请求的网址中指定 "alt=csv"。Reports API 不支持 JSON。
AccessTokenRefreshError/Invalid grant 运行应用时,出现此错误可能是因为以下原因:
  • 您的服务账号电子邮件地址不正确。在 Google Cloud 控制台 中检查电子邮件账号,确保其有权访问您的 API。
  • 该电子邮件地址没有 API 访问权限。检查该电子邮件地址是否有权访问您通过 Hotel Center 共享的酒店数据。
  • 密钥文件不是服务账号的正确密钥文件。使用 Google Cloud 控制台下载新的 .JSON 证书,并确保您的应用指向正确的证书。
HotelAdsAPIConnection object has no attribute credentials 运行应用时,.JSON 文件的路径不正确。
Invalid scope 运行应用时,您的 API 范围必须是以下之一:
  • "https://www.googleapis.com/auth/travelpartner"
  • "https://www.googleapis.com/auth/travel-partner-price-upload"
Forbidden 您使用的账号 ID 是您无权访问的账号 ID。如果您是子账号所有者,则可能无法访问父级账号或根账号 ID。