OAuth 2.0 SSO 概述
OAuth 2.0 是一个授权框架,可使应用程序通过 HTTP 服务获得对用户帐户的有限访问权限。它的工作原理是将用户身份验证委托给托管用户帐户的服务,并授权第三方应用程序访问用户帐户。OAuth 2.0 为 web、桌面应用程序以及移动设备提供授权流。
基本 SSO
无论你选择了哪种功能,基本 SSO 都需要一些特定的数据,特别是公钥。添加会员积分或信用卡集成功能将需要额外的信息。
设置信息
要正确设置模板网站的 OAuth 2.0 SSO 访问权限,我们需要以下内容:
- API(授权、令牌、userProfile)
- ClientId
- 客户端密钥
- ResponseMode
- isNonceEnabled
- customerDetailsAPIKey(如有)
授权流程

授权端点
GET /authorize 端点用于身份验证和授权。用户登录后,它会返回授权码或验证码。这是一个浏览器重定向,引导您提交凭据进行身份验证。
| 字段 | 说明 | 数据类型 | 示例值 | 是否必填? |
|---|---|---|---|---|
client_id | 用于识别客户端。必须与身份供应商 (IDP) 中预先注册的值一致。通过手动客户端注册或动态客户端注册 API 获取。 | 字符串 | 是 | |
nonce | 用于减轻重放攻击。该值将在 ID 令牌中返回。 | 字符串 | 是 | |
prompt | 验证所需的交互类型。如果为空,则用户必须登录(如果尚未通过身份验证)。如果为“无”,则身份提供商不会提示登录,但如果已登录则会返回授权码,否则会返回错误。 | 字符串 | 有效值: none 或者 为空 | — |
redirect_uri | 发送授权码或令牌的回调位置。必须与客户端注册时在 IDP 中预先注册的值一致。 | 字符串 | 是 | |
response_type | code (IDP) 值。 | 字符串 | 是 | |
response_mode | 返回授权响应的方式。 | 字符串 | 有效值: query | — |
scope | 访问令牌,用于获取个人资料详细信息。身份验证请求必填。 | 字符串 | 个人资料和电子邮件 | 是 |
state | 互动状态。该值会在令牌中返回,使用户能够点击进入、验证并返回到他们最初感兴趣的页面。该值可包含字母数字、逗号、句点、下划线和连字符。 | 字符串 | 是 | |
ui_locales | 用户偏好的用户界面语言和脚本。 | 字符串 | en_CA, fr_CA | — |
audience | 收件人。 | 字符串 | 由合作伙伴定义 | — |
响应参数
| 参数 | 说明 | 数据类型 | 是否必填? |
|---|---|---|---|
code | 用于识别客户端的授权码。它必须与 IDP 中预先注册的值一致。通过手动客户端注册或动态客户 端注册 API 获取。 | 字符串 | 是 |
state | 互动状态。该值会在令牌中返回,使用户能够点击进入、验证并返回到他们最初感兴趣的页面。该值可包含字母数字、逗号、句点、下划线和连字符。 | 字符串 | 是 |
授权示例 URL
https://example.com/authorize?client_id={clientID}&response_type=code&state=d6b93799-404b-4205-9bb3-c579b1180428&scope=email profile&nounce=234567687867&redirect_uri=https://{ExpediaDomain}/sso/auth示例回调 URL
https://{ExpediaDomain}/sso/auth?code=12345678&state=d6b93799-404b-4205-9bb3-c579b1180428令牌端点
POST /token端点是一个后端 API 调用,用于通过提供授权许可或代码来获取访问令牌和 ID 令牌。
请求参数
| 参数 | 说明 | 数据类型 | 是否必填? |
|---|---|---|---|
grant_type | IDP 用来授权令牌生成的机制。值:authorization_code | 字符串 | 是 |
redirect_uri | 指定发送授权的回调位置。该值必须与用于生成原始 authorization_code 的 redirect_uri 一致。 | 字符串 | 是 |
code | /authorize 调用响应中收到的客户端识别码。 | 字符串 | 是 |
请求标头
| 参数 | 说明 | 数据类型 | 示例值 | 是否必填? |
|---|---|---|---|---|
accept | 必须为“application/json” | 字符串 | application/json | 是 |
authorization | 用 Base64 编码客户端 ID 和秘钥。使用 HTTP 授权标头中的编码信息。 | 字符串 | Basic<Base64 encoded client ID and secret> | 是 |
Content-Type | 必须为“application/x-www-form-urlencoded” | 字符串 | application/x-www-form-urlencoded | 是 |
响应属性
| 字段 | 说明 | 数据类型 |
|---|---|---|
access_token | 访问令牌 | 字符串 |
token_type | 令牌的受众 | 字符串 |
expires_in | 访问令牌的过期时间(以秒为单位) | 整数 |
scope | 访问令牌中包含的作用域 | 字符串 |
示例令牌 CURL
curl --location 'https://example.com/token’ \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic {encoded ClientID:clientSecret}' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'redirect_uri=https://{ExpediaDomain}/sso/auth’ \
--data-urlencode 'code={Authorization code after login as part of callback to Expedia /sso/auth endpoint}'示例令牌响应
{
"access_token": "eyJhbGciOi.JSUzI1NiIsImtpZCI6Ilk1MkFDVXd3QV9SUzI1NiIsInBp.LmF0bSI6ImlrY20ifQ",
"token_type": "Bearer",
"expires_in": 1799
}用户信息端点
GET /userinfo端点是一个后端 API 调用,它根据提供的访问令牌返回有关已验证用户的声明。它会返回用户个人资料数据,用于将客户名称添加到网站的帐户标头中,然后可以通过程序帐户加载忠诚度等级信息。
**注意:**如果响应中未提供必需参数,则会导致网站用户体验出现问题。例如,客户姓名不会显示在模板网站上,并且 Expedia 端连接忠诚度注册所需的程序帐户信息将缺失。
请求头
| 字段 | 说明 | 数据类型 | 示例值 | 是否必填? |
|---|---|---|---|---|
ClientId | 用于识别客户端。必须与身份供应商 (IDP) 中预先注册的值一致。通过手动客户端注册或动态客户端注册 API 获取。 | 字符串 | 是 | |
Authorization | HTTP 标头用于发送凭据或令牌以验证用户身份 | 字符串 | 持有者 [access_token] | 是 |
响应
| 字段 | 说明 | 数据类型 | 示例值 | 是否必填? |
|---|---|---|---|---|
membershipId | 用于唯一标识客户帐户的标识符 | 字符串 | 是 | |
optIn | 此布尔标志表示 客户是否选择接收营销邮件 | 布尔值 | 真/假 | — |
languageId | 用户首选语言 | 字符串 | 英文,法文 | — |
channelType | 用户与应用程序交互的不同平台 | 字符串 | 网页、手机、平板电脑 | — |
firstName | 客户的名字 | 字符串 | 是 | |
middleName | 客户的中间名 | 字符串 | — | |
lastName | 客户的姓氏 | 字符串 | — | |
email | 客户的电子邮件地址 | 字符串 | — | |
programAccount | Loyalty-related 信息 | programAccount | 请参阅下方的Add loyalty -> programAccount部分了解对象详情。 | — |
用户信息示例 CURL
curl --location 'https://example.com/userinfo' \
--header 'client_id: {clientId}' \
--header 'Authorization: Bearer {acess_token from token endpoint}'用户信息响应示例
{
"membershipId": "12345678",
"languageID": "en",
"middleName": "MiddleName",
"lastName": "LastName",
"firstName": "FirstName",
"email": "test@expediagroup.com",
"programAccount": {
"programId": "Gold",
"loyaltyAccountBalance": {
"value": "10000",
"currency": "Points"
}
}
}添加会员积分
作为模板网站的一部分,您可以添加让客户在购买旅行产品时赚取积分的功能。如果您愿意,您的模板还可以允许客户使用他们积累的忠诚度积分购买旅行。
设置要求与标准实施的设置相同,许多值也是如此。这里只包括那些有所不同的值。
除了标准的user information之外,忠诚度计划设置还将包括以下值。
programAccount
| 字段 | 说明 | 数据类型 | 是否必填? |
|---|---|---|---|
programId | 客户所属会员计划的标识符或与会员计划相关的等级名称 | 字符串 | 是 |
loyaltyAccountNumber | 客户会员帐号;只有在会员操作需要辅助标识符(除唯一的 membershipId 外)时才应填入 | 字符串 | — |
lastFourDigitsOfCreditCard | 客户预订所用信用卡的最后 4 位数 | 整数 | — |
accountName | 计划名称(如果与等级名称不同) | 字符串 | — |
loyaltyConversionRatio | 消费金额转换为累积积分的比率(例如 $1 = 1 积分) | 双倍 | — |
loyaltyAccountBalance | 客户累积会员积分的当前余额 | 金额 (有关项目详情,请参阅下方的“金额”部分) | — |
金额
| 字段 | 说明 | 数据类型 | 是否必填? |
|---|---|---|---|
value | 会员积分余额;嵌套在 loyaltyAccountBalance 之下 | 长期 | 是 |
currency | 会员计划使用的奖励货币,例如货币类型、积分和里程;嵌套在 loyaltyAccountBalance 之下 | 字符串 | 是 |
沉默的 sign-in
Silent sign-in 启用在与身份提供程序之间已存在有效会话时自动进行身份验证。如果用户已在其他浏览器标签页或应用程序中通过身份验证,则会重用现有会话,用户无需输入凭据即可登录。
此功能依赖于维护浏览器 cookie 来保存 logged-in 状态。标准登录和 SSO 流程都使用相同的授权端点。当检测到活动会话时,请求将被重定向到指定的 SSO 重定向 URL,而不会触发重新身份验证。
由于 cookie-based 会话持久性,SSO 只能在不受欧盟通用数据保护条例 (GDPR) 合规性要求约束的销售点启用。您需要在身份提供商设置中配置我们的重定向 URL,以启用 SSO 流程。Expedia 将在集成过程中提供重定向 URL。
网络允许列表
此列表定义了模板站点与 Expedia 环境之间安全通信的要求。我们将提供 AWS 出口 IP 地址范围,以及用于本地或 lower-environment 测试的 IP 地址。您必须将这些 IP 地址添加到允许列表中,以确保来自 Expedia 的入站流量不会被阻止。
您还需要与我们分享您组织的出站 IP 地址,以便我们能够将它们添加到我 们这边的允许列表中。
注意: 如果这些 IP 地址未添加到允许列表中(在任一端或两端),则出站和入站 SSO 调用都会出现连接问题。
Expedia 端点
您需要使用以下值配置身份提供程序上的 redirect_uri,以启用授权调用:
{WLTP domain}/sso/auth:SSO 重定向端点,在登录流程的授权调用之后{WLTP domain}/validateCurrentSession:SSO 重定向端点在静默 sign-in 流的授权调用之后
注意: Expedia 已设置标准最大会话超时时间为 60 分钟。60 分钟后,您需要刷新令牌。