OpenID Connect SSO の概要
OpenID Connect (OIDC) は OAuth 2.0 ベースの認証プロトコルで、大手テクノロジー企業で採用されています。
ベーシック SSO
選択した機能に関係なく、ベーシック SSO の設定要件は同じです。ロイヤルティまたはクレジット カードの実装を追加すると、追加情報が必要になります。
設定要件
テンプレートサイトへの OIDC SSO アクセスを適切に設定するには以下が必要です。
- API (authorize、token、userProfile, JWKS)
- ClientId
- クライアントシークレット
- ResponseMode
- isNounceEnabled
- customerDetailsAPIKey (利用可能な場合)
認証フロー

認証エンドポイント
GET /authorize
エンドポイントは認証と承認に使用されます。この関数は、次のような場合、クライアントに認可許可または認可コードを返します。logged-in. ブラウザのリダイレクトです。
リクエストパラメーター
パラメーター | 説明 | データタイプ | サンプル値 | 必須/必須ではない |
---|---|---|---|---|
client_id | クライアントを識別します。ID プロバイダー (IDP) に事前に登録されている値と一致する必要があります。手動クライアント登録時、または Dynamic Client Registration API 経由で取得されます。 | 文字列 | 必須 | |
nonce | リプレイ攻撃を軽減するために使用されます。この値は ID トークンで返されます。 | 文字列 | 必須 | |
prompt | 検証に必要なインタラクションのタイプ。Empty "の場合、認証されていなければログインする必要があります。none」の場合、IDPはログインを要求しませんが、ログインしていれば認証コードを返し、ログインしていなければエラーを返します。 | 文字列 | 有効な値 : なしOR空 | 必須ではない |
redirect_uri | 認証コードまたはトークンを送信するコールバックの場所。クライアント登録時に IDP に事前登録された値と一致する必要があります。 | 文字列 | 必須 | |
response_type | code (IDP) の値。 | 文字列 | 必須 | |
response_mode | 承認レスポンスを返す方法。 | 文字列 | 有効な値 : query | 必須ではない |
scope | プロフィールの詳細を取得するために使用されるアクセストークン。認証リクエストに必要です。 | 文字列 | OpenID、profile、email | 必須 |
state | インタラクションの状態。この値はトークンで返され、ユーザーがクリックスルーし、認証して本来興味のあるページに戻ることを可能にします。値には英数字、カンマ、ピリオド、アンダースコア、ハイフンを含めることができます。 | 文字列 | 必須 | |
ui_locales | ユーザーインターフェースに使用される言語とスクリプト。 | 文字列 | en_CA, fr_CA | 必須ではない |
audience | 意図した受取人 | 文字列 | パートナーによる定義 | 必須ではない |
レスポンスパラメーター
パラメーター | 説明 | データタイプ | 必須/必須ではない |
---|---|---|---|
code | クライアントを識別する認証コード。IDP に事前に登録されている値と一致する必要があります。手動クライアント登録時、または Dynamic Client Registration 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
エンドポイントは、認可グラントまたはコードを提示してアクセストークンとIDトークンを取得するために使用されるバックエンドAPI呼び出しです。
リクエストパラメーター
パラメーター | 説明 | データタイプ | 必須/必須ではない |
---|---|---|---|
grant_type | トークンの作成を承認するために IDP が使用するメカニズム。値 : authorization_code | 文字列 | 必須 |
redirect_uri | 承認が送信されたコールバックの場所を指定します。この値は、元の authorization_code の生成に使われた redirect_uri と一致する必要があります。一致しない場合、トークンエンドポイントでエラーが発生します。 | 文字列 | 必須 |
code | /authorize 呼び出しレスポンスで受信したクライアント識別コード。 | 文字列 | 必須 |
リクエストヘッダー
フィールド | 説明 | データタイプ | サンプル値 | 必須/必須ではない |
---|---|---|---|---|
accept | 「application/json」とする必要があります。 | 文字列 | application/json | 必須 |
authorization | クライアント ID とシークレットを Base64 でエンコードします。HTTP 承認ヘッダーにエンコードされた情報を使用します。 | 文字列 | Basic<Base64 でエンコードされたクライアント ID とシークレット> | 必須 |
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) で、クレームと呼ばれる認証情報の断片を含んでいます。以下の表のように、エクスペディアのテンプレートソリューションではクレームとして header
、payload
、signature
を使用しています。
ヘッダークレーム
フィールド | 説明 | データタイプ | 必須/必須ではない |
---|---|---|---|
alg | 使用されるデジタル署名アルゴリズムを特定 (常に RS256) | 文字列 | 必須ではない |
kid | キー ID : ID トークンの検証に使用される公開鍵を特定 (対応する公開鍵は、JSON Web Key Set (JWKS) 経由で見つけることができます) | 文字列 | 必須 |
ペイロードクレーム
フィールド | 説明 | データタイプ | 必須/必須ではない |
---|---|---|---|
amr | 認証方法の識別子となる文字列の JSON 配列 | 配列 | 必須ではない |
aud | この ID トークンの対象者を特定 (アプリケーションの OAuth 2.0 クライアント ID のいずれか) | 文字列 | 必須 |
auth_time | エンドユーザーが認証された時刻 (Unix時間 (秒) で表される) | 整数型 | 必須ではない |
exp | ID トークンの有効期限 (Unix時間 (秒) で表される) | 整数型 | 必須 |
iat | ID トークンが発行された時刻 (Unix時間 (秒) で表される) | 整数型 | 必須ではない |
idp | ID プロバイダーのインジケーター | 文字列 | 必須 |
iss | この ID トークンを発行した承認サーバーの URL | 文字列 | 必須ではない |
jti | デバッグと失効を目的とした、この ID トークンの一意の識別子 | 文字列 | 必須 |
sub | 承認呼び出しの対象 (ユーザー) の一意の識別子 | 文字列 | 必須ではない |
ver | ID トークンのセマンティックバージョン | 整数型 | 必須 |
署名クレーム
署名の検証:署名は、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呼び出しです。
リクエストヘッダ
フィールド | 説明 | データタイプ | サンプル値 | 必須/必須ではない |
---|---|---|---|---|
ClientId | クライアントを識別します。ID プロバイダー (IDP) に事前に登録されている値と一致する必要があります。手動クライアント登録時、または Dynamic Client Registration API 経由で取得されます。 | 文字列 | 必須 | |
Authorization | ユーザーを認証するためのクレデンシャルまたはトークンを送信するために使用されるHTTPヘッダー。 | 文字列 | ベアラーaccess_token] | 必須 |
レスポンス
フィールド | 説明 | データタイプ | サンプル値 | 必須/必須ではない |
---|---|---|---|---|
membershipId | お客様の口座を一意に識別する識別子 | 文字列 | 必須 | |
optIn | 顧客がマーケティングメールの受信を許可しているかどうかのブール値フラグ | Boolean (ブール型) | 真/偽 | 必須ではない |
languageId | ユーザーの希望言語 | 文字列 | Ja, fr | 必須ではない |
channelType | ユーザーがアプリケーションとやりとりするさまざまなプラットフォーム | 文字列 | ウェブ、モバイル、タブレット | 必須ではない |
firstName | お客様のお名前 | 文字列 | 必須 | |
middleName | お客様のミドルネーム | 文字列 | 必須ではない | |
lastName | お客様の姓 | 文字列 | 必須ではない | |
email | お客様のEメールアドレス | 文字列 | 必須ではない | |
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 を受け付けることができるため、これは必須ではありません。
クレジットカードの安全性と保管
組織のカスタムクレジット カードを使用して購入することを義務付けた場合でも、心配は無用です。クレジットカードは次のように扱われます。
- 顧客のエクスペディアプロフィールにリンクされた、トークン化された形式でカード情報が保存されます。暗号化されていない状態で保存されることは決してありません。
- 人間は暗号化されていないカードデータにアクセスできず、安全な IAM ログイン情報を使用しないと復号化できなくなっています。
- カードがチェックアウトページにプリロードされると、カード番号ではなくカードの説明のみが表示されます。
- 保存されたカードで予約を完了する場合、顧客はカードのセキュリティコードを入力する必要があります。
設定要件
標準実装の設定要件に加え、クレジットカードが追加されると以下が必要になります。
- AuthnRequest パラメーターに使用するエンドポイント
- 署名検証用の公開鍵
エクスペディアでは自社の秘密鍵を使用して AuthnRequest ペイロードに署名し、貴社側で署名検証を実行してもらうためにエクスペディアの公開鍵を使用します。
ペイロードの詳細
顧客がサイトにログインすると、クレジットカード SSO では、標準実装で説明されている属性とともに、セキュアなエクスペディア SSO エンドポイントに 2 つの取引パラメーターを送信します。
- ユーザー情報 API : 署名され暗号化されたアサーションを持つ、エンコードされ署名されたレスポンスペイロード。
- RelayState : ランディングページ URL へのディープリンク。
ペイロードには次のクレジットカードの詳細も含まれます。
フィールド | 説明 | 必須/必須ではない |
---|---|---|
cardNumber | 請求対象のクレジットカードの番号 | 必須 |
cardType | 使用されるカードの種類 (例 : Visa、MasterCard、American Express) | 必須 |
expirationDate | 使用されるクレジットカードの有効期限 | 必須 |
BillingAddress | 使用されたカードと関連付けられているクレジットカード登録住所 | 必須 |
addressCategoryCode | 自宅や会社などの請求先の住所の種類 (BillingAddress の下にネスト) | 必須 |
firstAddressLine | クレジットカード登録住所の 1 行目 (BillingAddress の下にネスト) | 必須 |
secondAddressLine | クレジットカード登録住所の 2 行目 (BillingAddress の下にネスト) | 必須ではない |
thirdAddressLine | クレジットカード登録住所の 3 行目 (BillingAddress の下にネスト) | 必須ではない |
cityName | クレジットカード登録住所の市町村 (BillingAddress の下にネスト) | 必須 |
provinceName | クレジットカード登録住所の都道府県 (BillingAddress の下にネスト) | 必須 |
postalCode | クレジットカード登録住所の郵便番号 (BillingAddress の下にネスト) | 必須 |
countryCode | クレジットカード登録住所の国コード (BillingAddress の下にネスト) | 必須 |