OAuth 2.0 SSO の概要
OAuth 2.0 は、アプリケーションが HTTP サービス上のユーザーアカウントへの限定的なアクセス権を取得できるようにする承認フレームワークです。ユーザーアカウントをホストするサービスにユーザー認証を委譲し、サードパーティのアプリケーションにユーザーアカウントへのアクセスを許可することで機能します。OAuth 2.0 は、Web およびデスクトップアプリケーション、モバイルデバイスのための承認フローを提供します。
ベーシック SSO
選択した機能に関係なく、ベーシック SSO ではいくつかの特定のデータ、特に公開鍵を必要とします。ロイヤルティまたはクレジットカードの実装を追加すると、 追加情報が必要になります。
設定情報
テンプレートサイトへの OAuth 2.0 SSO アクセスを適切に設定するには以下が必要です。
- API (認証、トークン、ユーザープロフィール)
- ClientId
- クラ イアントシークレット
- ResponseMode
- isNounceEnabled
- customerDetailsAPIKey (利用可能な場合)
認証フロー

エンドポイントの認証
GET /authorize エンドポイントは認証と承認に使用されます。ユーザーがログインすると、認証グラントまたは認証コードが返されます。これは、認証のために認証情報を入力するよう誘導するブラウザのリダイレクトです。
| フィールド | 説明 | データタイプ | サンプル値 | 必須/必須ではない |
|---|---|---|---|---|
client_id | クライアントを識別します。ID プロバイダー (IDP) に事前に登録されている値と一致する必要があります。手動クライアント登録時、または Dynamic Client Registration API 経由で取得されます。 | 文字列 | 必須 | |
nonce | リプレイ攻撃を軽減する ために使用されます。この値は ID トークンで返されます。 | 文字列 | 必須 | |
prompt | 検証に必要なインタラクションのタイプ。「空」の場合、まだ認証されていないユーザーはログインする必要があります。「none」の場合、IDPはログインを要求しませんが、ログイン済みの場合は認証コードを返し、そうでない場合はエラーを返します。 | 文字列 | 有効な値 : none OR EMPTY | — |
redirect_uri | 認証コードまたはトークンを送信するコールバックの場所。クライアント登録時に IDP に事前登録された値と一致する必要があります。 | 文字列 | 必須 | |
response_type | code (IDP) の値。 | 文字列 | 必須 | |
response_mode | 承認レスポンスを返す方法。 | 文字列 | 有効な値 : query | — |
scope | プロフィールの詳細を取得するために使用されるアクセストークン。認証リクエストに必要です。 | 文字列 | プロフィールとメールアドレス | 必須 |
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=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 | アクセストークンに含まれるスコープ | 文字列 |
トークンのサンプル(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
}Userinfoエンドポイント
GET /userinfoエンドポイントは、指定されたアクセストークンに基づいて、認証済みユーザーに関するクレームを返すバックエンドAPI呼び出しです。この関数はユーザーのプロファイルデータを返します。このデータは、サイトのアカウントヘッダーに顧客名を表示するために使用され、それによってプログラムアカウントを通じて ロイヤルティ のティア情報を読み込むことができます。
注: レスポンスに必須パラメータが指定されていない場合、サイト上のユーザー体験に支障をきたすことになります。例えば、テンプレートサイトにはお客様の氏名が表示されず、エクスペディア側で ロイヤルティ の登録を連携させるために必要なプログラムアカウント情報が欠落してしまいます。
リクエストヘッダー
| フィールド | 説明 | データタイプ | サンプル値 | 必須/必須ではない |
|---|---|---|---|---|
ClientId | クライアントを識別します。ID プロバイダー (IDP) に事前に登録されている値と一致する必要があります。手動クライアント登録時、または Dynamic Client Registration API 経由で取得されます。 | 文字列 | 必須 | |
Authorization | ユーザーの認証を行うために、認証情報やトークンを送信するために使用されるHTTPヘッダー | 文字列 | 持参人access_token] | 必須 |
レスポンス
| フィールド | 説明 | データタイプ | サンプル値 | 必須/必須ではない |
|---|---|---|---|---|
membershipId | お客様のアカウントを一意に識別する識別子 | 文字列 | 必須 | |
optIn | 顧客がマーケティングメールの配信を承諾したかどうかのブール値フラグ | Boolean (ブール型) | 真/偽 | — |
languageId | ユーザーの希望する言語 | 文字列 | En, fr | — |
channelType | ユーザーがアプリケーションとやり取りを行うさまざまなプラットフォーム | 文字列 | WEB、モバイル、タブレット | — |
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}'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 の下にネスト) | 文字列 | 必須 |
サイレントsign-in
「sign-in」をサイレントモードに設定すると、IDプロバイダーとの間で有効なセッションがすでに存在する場合、自動認証が行われます。ユーザーが別のブラウザタブやアプリケーションで認証済みの場合、既存のセッションが再利用され、認証情報の入力を求められることなくログインされます。
この機能は、logged-inの状態を維持するために、ブラウザのクッキーを保持することに依存しています。標準ログインとSSOフローの両方で、同じ認証エンドポイントが使用されます。アクティブなセッションが検出されると、再認証を行わずに、リクエストは指定されたSSOリダイレクトURLへリダイレクトされます。
cookie-basedのセッション保持機能のため、SSOは、EUの一般データ保護規則(GDPR)の遵守要件の対象とならない販売拠点でのみ有効にすることができます。SSOフローを有効にするには、アイデンティティプロバイダーの設定で、当社のリダイレクトURLを設定していただく必要があります。エクスペディアは、連携の際にリダイレクトURLを提供いたします。
ネットワークの許可リスト
このリストでは、テンプレートサイトとエクスペディアの環境間での安全な通信に関する要件を定義しています。AWSのアウトバウンドIP範囲に加え、ローカルまたはlower-environmentでのテストに使用されるIPアドレスをご提供いたします。エクスペディアからの着信トラフィックがブロックされないようにするには、これらのIPアドレスを許可リストに追加する必要があります。
また、弊社側で許可リストに追加できるよう、貴組織の送信元IPアドレスをお知らせいただく必要があります。
注: これらのIPアドレスが(どちらか一方または双方の)許可リストに追加されていない場合、送信および受信の両方 のSSO呼び出しにおいて接続上の問題が発生します。
エクスペディアのエンドポイント
認証呼び出しを有効にするには、IDプロバイダーの「redirect_uri」を以下の値で設定する必要があります:
{WLTP domain}/sso/auth: ログインフローにおける認証呼び出し後のSSOリダイレクト先{WLTP domain}/validateCurrentSession: サイレントsign-inフローにおける認証呼び出し後のSSOリダイレクトエンドポイント
注: エクスペディアでは、セッションのタイムアウトを標準で60分に設定しています。60分が経過すると、トークンを更新する必要があります。