OpenID Connect SSO 概述
OpenID Connect (OIDC) 是一种基于 OAuth 2.0 的身份验证协议,已被各大技术公司采用。
基本 SSO
无论您选择了哪种功能,基本 SSO 的设置要求都是一样的。添加会员积分或信用卡集成功能将需要额外的信息。
设置要求
要正确设置模板网站的 OIDC SSO 访问权限,我们需要以下内容:
- API(授权、令牌、用户配置文件)
- ClientId
- 客户端密钥
- ResponseMode
- isNonceEnabled
- customerDetailsAPIKey(如有)
Expedia OIDC SSO 的实施标准将使用我们的公钥进行加密,创建授权后端点,启用一次性随机数并设置范围参数。我们还将提供用户信息。
授权
GET /authorize
端点用于身份验证和授权。它会向客户端返回授权许可。
请求参数
参数 | 说明 | 数据类型 | 示例值 | 是否必填? |
---|---|---|---|---|
client_id | 用于识别客户端。必须与身份供应商 (IDP) 中预先注册的值一致。通过手动客户端注册或动态客户端注册 API 获取。 | 字符串 | 是 | |
nonce | 用于减轻重放攻击。该值将在 ID 令牌中返回。 | 字符串 | 是 | |
prompt | 验证所需的交互类型。 | 字符串 | 有效值: none consent | 否 |
redirect_uri | 发送授权码或令牌的回调位置。必须与客户端注册时在 IDP 中预先注册的值一致。 | 字符串 | 是 | |
response_type | code (IDP) 值。 | 字符串 | 是 | |
response_mode | 返回授权响应的方式。 | 字符串 | 有效值: query | 否 |
scope | 访问令牌,用于获取个人资料详细信息。身份验证请求必填。 | 字符串 | OpenID、profile 和 email | 是 |
state | 互动状态。该值会在令牌中返回,使用户能够点击进入、验证并返回到他们最初感兴趣的页面。该值可包含字母数字、逗号、句点、下划线和连字符。 | 字符串 | 是 |
响应参数
参数 | 说明 | 数据类型 | 是否必填? |
---|---|---|---|
code | 用于识别客户端的授权码。它必须与 IDP 中预先注册的值一致。通过手动客户端注册或动态客户端注册 API 获取。 | 字符串 | 是 |
state | 互动状态。该值会在令牌中返回,使用户能够点击进入、验证并返回到他们最初感兴趣的页面。该值可包含字母数字、逗号、句点、下划线和连字符。 | 字符串 | 是 |
令牌
POST /token
端点用于通过提交授权许可来验证用户身份。
请求参数
参数 | 说明 | 数据类型 | 是否必填? |
---|---|---|---|
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 | 访问令牌中包含的作用域 | 字符串 |
id_token | OpenID 范围得到许可后返回的标识符 | 字符串 |
ID_token 是一个 JSON Web 令牌 (JWT),其中包含称为申请的身份验证信息。Expedia 模板解决方案使用 header
、payload
和 signature
申请,如下表所示。
Header 申请
字段 | 说明 | 数据类型 | 是否必填? |
---|---|---|---|
alg | 识别所使用的数字签名算法(始终为 RS256) | 字符串 | 否 |
kid | 密钥 ID:识别用于验证 ID 令牌的公钥;可通过 JSON Web 密钥集 (JWKS) 找到相应的公钥 | 字符串 | 是 |
Payload 申请
字段 | 说明 | 数据类型 | 是否必填? |
---|---|---|---|
amr | 作为身份验证方法标识符的字符串 JSON 数组 | 数组 | 否 |
aud | 识别此 ID 令牌的目标受众(您应用程序的 OAuth 2.0 客户端 ID 之一) | 字符串 | 是 |
auth_time | 终端用户通过身份验证的时间,以 Unix 时间表示(以秒为单位) | 整数 | 否 |
exp | ID 令牌的过期时间,以 Unix 时间表示(以秒为单位) | 整数 | 是 |
iat | ID 令牌的签发时间,以 Unix 时间表示(以秒为单位) | 整数 | 否 |
idp | 身份供应商的指示符 | 字符串 | 是 |
iss | 签发 ID 令牌的授权服务器的 URL | 字符串 | 否 |
jti | 该 ID 令牌的唯一标识符,用于调试和撤销用途 | 字符串 | 是 |
sub | 授权调用主体(用户)的唯一标识符 | 字符串 | 否 |
ver | ID 令牌的语义版本 | 整数 | 是 |
Signature 申请
签名验证:签名将根据 client_id
和算法的相应密钥进行验证。
添加会员积分
作为模板网站功能的一部分,您可以让客户通过旅行消费获得会员积分。如果您愿意,您的模板还可以支持客户[使用他们累积的会员积分]products/white-label-template/loyalty/setup()兑换旅游产品。
设置要求与标准实施的设置相同,许多值也是如此。这里只包括那些有所不同的值。
除了标准的用户信息外,会员计划设置还包括以下值:
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 的深度链接。
有效负载还将包含以下详细信用卡信息:
字段 | 说明 | 是否必填? |
---|---|---|
cardNumber | 要扣款的卡号 | 是 |
cardType | 使用的卡类型(例如 Visa、万事达卡、美国运通卡) | 是 |
expirationDate | 所使用银行卡的有效期 | 是 |
BillingAddress | 所使用银行卡的账单地址 | 是 |
addressCategoryCode | 账单地址类型,例如家或办公室;嵌套在 BillingAddress 之下 | 是 |
firstAddressLine | 账单地址的第一行;嵌套在 BillingAddress 之下 | 是 |
secondAddressLine | 账单地址的第二行,嵌套在 BillingAddress 之下 | 否 |
thirdAddressLine | 账单地址的第三行,嵌套在 BillingAddress 之下 | 否 |
cityName | 账单地址所在城市,嵌套在 BillingAddress 之下 | 是 |
provinceName | 账单地址所在省,嵌套在 BillingAddress 之下 | 是 |
postalCode | 账单地址邮政编码,嵌套在 BillingAddress 之下 | 是 |
countryCode | 账单地址国家/地区代码,嵌套在 BillingAddress 之下 | 是 |