OpenID Connect SSO 簡介
OpenID Connect (OIDC) 是各大科技公司都已採用的一種 OAuth 2.0 型驗證通訊協定。
基本 SSO
無論您選擇什麼功能,基本 SSO 的設定需求都相同。新增會員計畫或信用卡實作將需要額外的資訊。
設定需求
為了正確設定您範本網站的 OIDC SSO 存取權,我們需要一些項目,包括:
- API (授權、令牌、userProfile, JWKS)
- ClientId
- 用戶端密碼
- ResponseMode
- isNounceEnabled
- customerDetailsAPIKey (如果有)
授權流程

授權端點
GET /authorize 端點會用於驗證和授權,當使用者登入後,它會傳回授權授予或授權碼。這是一種瀏覽器重定向,會引導您提交憑證以進行驗證。
要求參數
| 參數 | 詳情 | 資料類型 | 範例值 | 是否為必要? |
|---|---|---|---|---|
client_id | 識別用戶端。必須符合您的識別提供者 (IDP) 中預先註冊的值。在手動用戶端註冊期間或透過動態用戶端註冊 API 取得。 | 字串 | 是 | |
nonce | 用於降低重新執行攻擊風險。此值會在識別碼標記中傳回。 | 字串 | 是 | |
prompt | 驗證所需的互動類型。若為「空」,且使用者尚未通過驗證,則必須登入。若設定為「none」,IDP 將不會提示登入,但若已登入則會傳回授權碼,否則會傳回錯誤訊息。 | 字串 | 有效值: 無或為空 | — |
redirect_uri | 應傳送授權碼或標記的回呼位置。必須符合用戶端註冊期間,在您的 IDP 中預先註冊的值。 | 字串 | 是 | |
response_type | code (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 呼叫,用於透過提交授權授予或授權碼來取得存取憑證和身分憑證。
要求參數
| 參數 | 詳情 | 資料類型 | 是否為必要? |
|---|---|---|---|
grant_type | IDP 用於授權建立標記的機制。值:authorization_code | 字串 | 是 |
redirect_uri | 指定傳送授權的回呼位置。此值必須符合用於產生原始 authorization_code 的 redirect_uri,否則標記端點會失敗。 | 字串 | 是 |
code | /authorize 呼叫回應中收到的用戶端識別碼。 | 字串 | 是 |
要求標頭
| 欄位 | 詳情 | 資料類型 | 範例值 | 是否為必要? |
|---|---|---|---|---|
accept | 必須是「application/json」 | 字串 | application/json | 是 |
authorization | 使用 Base64 對用戶端識別碼和密碼進行編碼。使用 HTTP 授權標頭中的編碼資訊。 | 字串 | Basic<Base64 編碼的用戶端識別碼和密碼> | 是 |
Content-Type | 必須是「application/x-www-form-urlencoded」 | 字串 | application/x-www-form-urlencoded | 是 |
回應參數
| 欄位 | 詳情 | 資料類型 |
|---|---|---|
access_token | 存取標記 | 字串 |
token_type | 標記的對象 | 字串 |
expires_in | 存取標記的到期時間 (秒) | 整數 |
scope | 存取標記中包含的範圍 | 字串 |
id_token | 授與 OpenID 範圍時傳回的識別碼 | 字串 |
ID_token
ID_token 是 JSON Web 標記 (JWT),其中包含稱為宣告的驗證資訊。Expedia 範本解決方案使用宣告 header、payload 和 signature,如下表所示。
標頭宣告
| 欄位 | 詳情 | 資料類型 | 是否為必要? |
|---|---|---|---|
alg | 識別所使用的數位簽章演算法 (一律為 RS256) | 字串 | — |
kid | 金鑰識別碼:識別用於驗證識別碼標記的公開金鑰;可透過 JSON Web 金鑰組 (JWKS) 找到對應的公開金鑰 | 字串 | 是 |
有效負載宣告
| 欄位 | 詳情 | 資料類型 | 是否為必要? |
|---|---|---|---|
amr | 做為驗證方法識別碼的 JSON 字串陣列 | 陣列 | — |
aud | 識別此識別碼標記的預定對象 (您應用程式的 OAuth 2.0 用戶端識別碼之一) | 字串 | 是 |
auth_time | 終端使用者的驗證時間,以 Unix 時間 (秒) 表示 | 整數 | — |
exp | 識別碼標記的到期時間, 以 Unix 時間 (秒) 表示 | 整數 | 是 |
iat | 識別碼標記的發行時間,以 Unix 時間 (秒) 表示 | 整數 | — |
idp | 識別提供者的指標 | 字串 | 是 |
iss | 發行此識別碼標記的授權伺服器網址 | 字串 | — |
jti | 此識別碼標記的唯一識別碼,用於偵錯和撤銷目的 | 字串 | 是 |
sub | 授權呼叫之主體 (使用者) 的唯一識別碼 | 字串 | — |
ver | 識別碼標記的語意版本 | 整數 | 是 |
簽章宣告
簽名驗證:系統將使用該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
}Userinfo 端點
GET /userinfo端點是一個後端 API 呼叫,會根據提供的存取憑證,回傳關於已驗證使用者的聲明。此功能會傳回使用者個人資料,用於在網站的帳戶頁首顯示客戶姓名,並可透過該計畫帳戶載入忠誠度等級資訊。
注意: 若回應中未提供必填參數,將導致網站上的使用者體驗出現問題。例如,客戶姓名將不會顯示在範本網站上,且用於連接 Expedia 端忠誠度註冊所需的程式帳戶資訊將會缺失。
請求標頭
| 欄位 | 詳情 | 資料類型 | 範例值 | 是否為必要? |
|---|---|---|---|---|
ClientId | 識別用戶端。必須符合您的識別提供 者 (IDP) 中預先註冊的值。在手動用戶端註冊期間或透過動態用戶端註冊 API 取得。 | 字串 | 是 | |
Authorization | 用於傳送憑證或代幣以驗證使用者身分的 HTTP 標頭 | 字串 | 持有人 [access_token] | 是 |
回應
| 欄位 | 詳情 | 資料類型 | 範例值 | 是否為必要? |
|---|---|---|---|---|
membershipId | 用於唯一識別客戶帳戶的識別碼 | 字串 | 是 | |
optIn | 客戶是否選擇訂閱行銷電子郵件的布林標記 | 布林 | 是/否 | — |
languageId | 使用者偏好的語言 | 字串 | En, fr | — |
channelType | 使用者透過哪些不同平台與應用程式進行互動 | 字串 | 網頁、行動裝置、平板電腦 | — |
firstName | 客戶的名字 | 字串 | 是 | |
middleName | 客戶的中間名 | 字串 | — | |
lastName | 客戶的姓氏 | 字串 | — | |
email | 客戶的電子郵件地址 | 字串 | — | |
programAccount | Loyalty-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}'Userinfo 回應範例
{
"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:連至登陸頁面網址的深層連結。
有效負載也將包含下列信用卡詳細資料:
| 欄位 | 詳情 | 是否為必要? |
|---|---|---|
cardNumber | 用於收費的卡號 | 是 |
cardType | 所使用的卡片類型 (例如 Visa、MasterCard、American Express) | 是 |
expirationDate | 所使用卡片的到期日 | 是 |
BillingAddress | 與 所使用卡片相關聯的帳單地址 | 是 |
addressCategoryCode | 帳單地址類型,例如住家或辦公室;嵌入至 BillingAddress 下方 | 是 |
firstAddressLine | 帳單地址的第一行;嵌入至 BillingAddress 下方 | 是 |
secondAddressLine | 帳單地址的第二行;嵌入至 BillingAddress 下方 | — |
thirdAddressLine | 帳單地址的第三行;嵌入至 BillingAddress 下方 | — |
cityName | 帳單地址的城市;嵌入至 BillingAddress 下方 | 是 |
provinceName | 帳單地址的州/省;嵌入至 BillingAddress 下方 | 是 |
postalCode | 帳單地址的郵遞區號;嵌入至 BillingAddress 下方 | 是 |
countryCode | 帳單地址的國碼 (地區碼);嵌入至 BillingAddress 下方 | 是 |
靜默 sign-in
「靜默」sign-in 可在與身分識別提供者之間已存在有效連線時,啟用自動驗證。如果使用者已在另一個瀏覽器分頁或應用程式中完成驗證,系統將重新使用現有的會話,使用者將自動登入,無需再次輸入憑證。
此功能仰賴於維持瀏覽器 Cookie,以保留 logged-in 的狀態。它對標準登入流程和 SSO 流程均使用相同的授權端點。當偵測到有效的工作階段時,系統會將請求重定向至指定的 SSO 重定向網址,且不會觸發重新驗證。
由於 cookie-based 的會話持久性機制,僅能針對不受歐盟《一般資料保護條例》(GDPR)合規要求約束的銷售據點啟用單一登入 (SSO)。您需要在身分識別供應商的設定中配置我們的重定向網址,以啟用單一登入流程。Expedia 將在整合過程中提供重定向網址。
網路允許清單
此清單定義了您的範本網站與 Expedia 環境之間進行安全通訊所需的要求。我們將提供 AWS 出站 IP 範圍,以及用於本地或 lower-environment 測試的 IP 位址。您必須將這些 IP 地址加入允許清單,以確保來自 Expedia 的傳入流量不會被封鎖。
您還需要向我們提供貴組織的發送端 IP 位址,以便我們將其加入我們這邊的允許清單中。
注意: 若未將這些 IP 位址加入允許清單 (無論是任一端或雙方),出站與入站的 SSO 呼叫都將出現連線問題。
Expedia 端點
您需要在身分識別提供者上將「redirect_uri」設定為以下值,以啟用授權呼叫:
{WLTP domain}/sso/auth:登入流程中,授權呼叫完成後的 SSO 重定向終點{WLTP domain}/validateCurrentSession:在「無互動」sign-in 流程中,授權呼叫完成後傳送至 SSO 重定向終點
注意: Expedia 已將標準的最大會話超時設定為 60 分鐘。60 分鐘後,您需要重新產生存取憑證。