This is an auto-generated translation

OpenID Connect SSO 概述

OpenID Connect (OIDC) 是一种基于 OAuth 2.0 的身份验证协议,已被各大技术公司采用。

进一步了解 OIDC

基本 SSO

无论您选择了哪种功能,基本 SSO 的设置要求都是一样的。添加会员积分或信用卡集成功能将需要额外的信息。

设置要求

要正确设置模板网站的 OIDC SSO 访问权限,我们需要以下内容:

  • API(授权、令牌、userProfile、JWKS)
  • ClientId
  • 客户端密钥
  • ResponseMode
  • isNonceEnabled
  • customerDetailsAPIKey(如有)

授权流程

OIDC Authorization flows

授权端点

GET /authorize 端点用于身份验证和授权。用户登录后,它会返回授权码或验证码。这是一个浏览器重定向,引导您提交凭据进行身份验证。

请求参数

参数说明数据类型示例值是否必填?
client_id用于识别客户端。必须与身份供应商 (IDP) 中预先注册的值一致。通过手动客户端注册或动态客户端注册 API 获取。字符串 
nonce用于减轻重放攻击。该值将在 ID 令牌中返回。字符串 
prompt验证所需的交互类型。如果为空,则用户必须登录(如果尚未通过身份验证)。如果为“无”,则身份提供商不会提示登录,但如果已登录则会返回授权码,否则会返回错误。字符串有效值:
无或空
redirect_uri发送授权码或令牌的回调位置。必须与客户端注册时在 IDP 中预先注册的值一致。字符串 
response_typecode (IDP) 值。字符串 
response_mode返回授权响应的方式。字符串有效值:
query
scope访问令牌,用于获取个人资料详细信息。身份验证请求必填。字符串OpenID、profile 和 email
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=openid 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_typeIDP 用来授权令牌生成的机制。值:authorization_code字符串
redirect_uri指定发送授权的回调位置。该值必须与用于生成原始 authorization_coderedirect_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访问令牌中包含的作用域字符串
id_tokenOpenID 范围得到许可后返回的标识符字符串

ID_token

ID_token 是一个 JSON Web 令牌 (JWT),其中包含称为申请的身份验证信息。Expedia 模板解决方案使用 headerpayloadsignature 申请,如下表所示。

Header 申请

字段说明数据类型是否必填?
alg识别所使用的数字签名算法(始终为 RS256)字符串
kid密钥 ID:识别用于验证 ID 令牌的公钥;可通过 JSON Web 密钥集 (JWKS) 找到相应的公钥字符串

Payload 申请

字段说明数据类型是否必填?
amr作为身份验证方法标识符的字符串 JSON 数组数组
aud识别此 ID 令牌的目标受众(您应用程序的 OAuth 2.0 客户端 ID 之一)字符串
auth_time终端用户通过身份验证的时间,以 Unix 时间表示(以秒为单位)整数
expID 令牌的过期时间,以 Unix 时间表示(以秒为单位)整数
iatID 令牌的签发时间,以 Unix 时间表示(以秒为单位)整数
idp身份供应商的指示符字符串
iss签发 ID 令牌的授权服务器的 URL字符串
jti该 ID 令牌的唯一标识符,用于调试和撤销用途字符串
sub授权调用主体(用户)的唯一标识符字符串
verID 令牌的语义版本整数

Signature 申请

签名验证:将使用与该 JWKS endpoint和算法对应的适当密钥(使用 client_id获取)验证签名。

示例令牌 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",
    "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6.IllEQnJQdlllYlRwa1laODZoaGk1MkFDVX.d3QV9SUzI1NiJ9",
    "token_type": "Bearer",
    "expires_in": 1799
}

用户信息端点

GET /userinfo端点是一个后端 API 调用,它根据提供的访问令牌返回有关已验证用户的声明。它会返回用户个人资料数据,用于将客户名称添加到网站的帐户标头中,然后可以通过程序帐户加载忠诚度等级信息。

**注意:**如果响应中未提供必需参数,则会导致网站用户体验出现问题。例如,客户姓名不会显示在模板网站上,并且 Expedia 端连接忠诚度注册所需的程序帐户信息将缺失。

请求头

字段说明数据类型示例值是否必填?
ClientId用于识别客户端。必须与身份供应商 (IDP) 中预先注册的值一致。通过手动客户端注册或动态客户端注册 API 获取。字符串 
AuthorizationHTTP 标头用于发送凭据或令牌以验证用户身份字符串持有者 [access_token]

响应

字段说明数据类型示例值是否必填?
membershipId用于唯一标识客户帐户的标识符字符串 
optIn此布尔标志表示客户是否选择接收营销邮件布尔值真/假
languageId用户首选语言字符串英文,法文
channelType用户与应用程序交互的不同平台字符串网页、手机、平板电脑
firstName客户的名字字符串 
middleName客户的中间名字符串 
lastName客户的姓氏字符串 
email客户的电子邮件地址字符串 
programAccountLoyalty-related 信息programAccount请参阅下方的Add loyalty -> programAccount部分了解对象详情。
CardDetails客户信用卡详情CardDetails请参阅下方的Restrict payment card -> Payload details部分了解对象详情。

用户信息示例 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 之下字符串

限制付款卡

我们可以设置您的网站,让旅行者必须使用贵公司的信用卡才能预订。这是可选设置,因为所有模板解决方案都可以接受所有主流信用卡或借记卡以及 PayPal(美国境内)支付。

信用卡安全和存储

如果您选择要求使用贵组织自定义的信用卡预订,我们希望让您感到安心。我们通过以下方式确保安全。

  • 银行卡信息以标记化形式存储,并与客户的 Expedia 个人资料关联。始终采用加密存储。
  • 任何人都无法访问未加密的银行卡数据,只有使用安全的 IAM 凭证才能解密。
  • 当卡被预先加载到结账页面时,只能看到卡的介绍,但看不到卡号。
  • 客户必须输入信用卡安全码才能使用存储卡完成预订。

设置要求

添加信用卡功能意味着除了标准实施的设置要求外,还需要:

  • 用于 AuthnRequest 参数的端点。
  • 用于签名验证的公钥。

我们将使用 Expedia 的私钥为 AuthnRequest 有效负载签名,并使用我们的公钥为您的终端提供签名验证。

有效负载详情

当客户登录您的网站时,除了标准实施中描述的属性外,信用卡 SSO 还会向安全的 Expedia SSO 端点发送两个交易参数:

  • 用户信息 API:已编码和签名的响应有效负载,带有签名和加密的断言。
  • RelayState:指向着陆页 URL 的深度链接。
Information

注意

如果您的模板网站也设置了赚取积分的功能,则还需要 programAccount 信息。

有效负载还将包含以下详细信用卡信息:

字段说明是否必填?
cardNumber要扣款的卡号
cardType使用的卡类型(例如 Visa、万事达卡、美国运通卡)
expirationDate所使用银行卡的有效期
BillingAddress所使用银行卡的账单地址
addressCategoryCode账单地址类型,例如家或办公室;嵌套在 BillingAddress 之下
firstAddressLine账单地址的第一行;嵌套在 BillingAddress 之下
secondAddressLine账单地址的第二行,嵌套在 BillingAddress 之下
thirdAddressLine账单地址的第三行,嵌套在 BillingAddress 之下
cityName账单地址所在城市,嵌套在 BillingAddress 之下
provinceName账单地址所在省,嵌套在 BillingAddress 之下
postalCode账单地址邮政编码,嵌套在 BillingAddress 之下
countryCode账单地址国家/地区代码,嵌套在 BillingAddress 之下

沉默的 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 分钟后,您需要刷新令牌。

您觉得这个页面有用吗?
我们该如何改进这些内容?
感谢您帮助我们改进!