OpenID Connect 要求マッピング Open Banking インテント ID

サード・パーティー・アプリケーションは、ユーザー許可を必要とするトランザクション (例えば、決済転送) を開始する場合、金融機関または銀行によって提供される API を使用して、トランザクションの詳細を登録します。 例えば、トランザクションの金額と通貨のタイプが登録されます。 このプロセスは、「インテントの宿泊」と呼ばれることもあります。 API は、インテント ID (UK Open Banking 仕様では同意 ID とも呼ばれる) で応答します。 アプリケーションは OAuth 許可コード・フローを開始して、ユーザー同意として記録されたユーザー許可を取得します。

トランザクションを表すペイロードと、許可要求にインテント ID を組み込むプロセスは明確に定義されていないため、管理者はIBM® Verifyを使用して、カスタム・ルールを使用して以下のアクションをスクリプト化することができます。
  • 要求からインテント ID を抽出します。
  • 通常は銀行の API を呼び出して、インテント・コンテキスト情報を取得します。
  • id_tokenで権限をクレームまたはスコープの値として表す方法を選択します。
カスタム・ルールは、複数行ルール実行プログラムで説明されている構文に基づいています。 より単純なルールは単一行にすることができ、YAML 形式で作成する必要はありません。

使用可能な入力オブジェクト

このカスタム・ルールは認証の後、許可の前に実行されるため、使用可能な情報には、可能なすべてのドメイン・オブジェクトが含まれているわけではありません。 以下のタイプに限定されます。

HTTP 要求コンテキスト
ユーザーがVerifyにログインすると、要求マッピング・ルールで着信 HTTP 要求コンテキストにアクセスできます。 すべての OAuth 要求パラメーター (claimsscopeなど) は、このrequestContextで使用できます。 の一般的な構造と使用法については、 属性関数の requestContext 「 HTTP リクエストコンテキスト」セクションで説明されています。
簡単にアクセスできるように、requestContextでは特定の値が事前計算されています。 claims要求パラメーターは、通常、以下の例のような JSON として表されます。

{
    "id_token": { 
        "claim_name": { 
            "essential": false, 
            "value": "some_value"
        }
    },
    "userinfo": {
        "claim_name": { 
            "essential": false, 
            "value": "some_value"
        }
    }
}

この JSON はアクセスが煩雑になる可能性があるため、requestContextで使用されるキーの形式はclaims_claimType_claimNameになります。 claimTypeは、userinfoまたはidtokenのいずれかです。 欠落している下線に注意してください。 したがって、前の例では、requestContext.getValue('claims_idtoken_claim_name')を使用してclaim_name値を取得できます。

同様に、scopeは、ストリング配列を作成するために計算され、スペースで分割されます。

ID ソースの資格情報

ユーザーがVerifyにログインすると、ID ソース資格情報属性がログイン・セッションに追加され、要求マッピング・ルールでアクセスできるようになります。

idsuserドメイン・オブジェクトは、ストリング・キーとストリング配列値を持つマップとして使用できます。 例えば、以下のとおりです。

{
  "realmName": ["cloudIdentityRealm"],
  "displayName": ["Jessica J. Hill"],
  "phone": ["+12324321234"]
}
詳細については、 属性関数を参照してください。
その他の関数および演算子

マッピング・ルールでは、標準の演算子と関数を使用できます。 HTTP クライアントは、アウトバウンド要求を行うためにも使用できます。 サポートされるその他の機能には、ハッシュおよびタイム・スタンプが含まれます。 属性関数の関連セクションを参照してください。

オブジェクトを返す

このカスタム・ルールは許可コンテキストを作成するために解釈する必要があるため、このルールの戻り値は、以下の必須プロパティーを含む JSON オブジェクトでなければなりません。

プロパティー タイプ 必須かどうか 説明
type ストリング はい タイプは、実行中のトランザクションのタイプを示します。 例えば、支払開始などです。 これは、Verify ではデータ・プライバシーの目的として表されます。 システムによって提供または生成される目的 ID は、typeの値です。
intentID ストリング はい インテント ID を指定する必要があります。 これは通常、requestContextから計算されます。
claims JSON オブジェクト。 JSON プロパティー値は、任意のタイプにすることができます。 いいえ 通常、ユーザー許可の場合、生成される ID トークンには、インテント ID によって識別されるトランザクションをユーザーが許可したことを示す何らかの標識が含まれます。 claimsは JSON オブジェクトまたはマップです。ここで、キーはクレーム名であり、値は任意の JSON 互換構造 (ストリング、整数、別のオブジェクト、配列、またはその他の構造など) にすることができます。 複数のクレームを指定することもできます。
scope ストリング いいえ 要求が許可されている場合、この値は許可されたスコープに追加されます。

金額や通貨などの追加属性は、カスタム属性として扱われます。 これらは、後述の対応するテンプレート・マクロを使用して、ユーザー同意ページに表示できます。

UK Open Banking の例

支払いを開始するには、まずインテントを宿泊させる必要があります。 このシナリオには、以下の参加者が関与します。
  • サード・パーティー・プロバイダーに常駐し、支払いトランザクションを開始する決済開始サービス・プロバイダー (PISP)。
  • アカウント情報サービス・プロバイダー (ASPSP) 許可サーバー。 このシナリオでは、ASPSP はVerifyです。
  • 支払い開始 API をホストする ASPSP リソース・サーバー。
PISP は、インテント ID とともに許可サーバーに対して許可を実行するようにユーザーをリダイレクトします。 許可サーバーは、以下のタスクを実行する必要があります。
  1. インテント ID を抽出します。
  2. リソース・サーバーからこのトランザクションに関する情報を取得します。
このカスタム・ルールは、これらの操作の両方を実行します。
要求からインテント ID を抽出している
この例は、claimsを介してインテント ID を送信する UK Open Banking 標準に従っています。 着信許可要求には、クレーム内のopenbanking_intent_idが含まれています。

{
	"id_token": {
		"openbanking_intent_id": {
			"value": "b508f9df-799b-4120-a13e-5d09f2931fa6",
			"essential": true
		}
	}
}
クレームが抽出され、要求コンテキストで使用可能になります。 値を取得するために使用されるコードは、以下のとおりです。

requestContext.getValue('claims_idtoken_openbanking_intent_id')
トランザクション情報の検索
トランザクション情報は、同意またはインテント ID が生成されたアカウント・サービス提供サービス・プロバイダ (ASPSP) リソース・サーバーに保管されます。 HTTP クライアントを使用して、リソース・サーバーに要求を出します。 以下の要求は例です。
hc.getAsJSON("https://resource.myaspsp.com/internal/intents/" + context.intentID
プライバシーの目的と請求へのトランザクションのマップ
Open Banking 決済の開始とアカウント・アクセスの同意をキャプチャーするには、関連するプライバシー目的を作成する必要があります。 例えば、支払い開始同意要求に対して payment_initiationプライバシー目的を作成する必要があります。 その後、この目的は、戻りオブジェクトのtypeプロパティーにマップされます。
さらに、UK Open Banking の場合は、openbanking_intent_idクレームを作成する必要があります。 トランザクションに関する残りの情報は、返品オブジェクトに追加することもできます。

{
   "type": "payment_initiation",
   "intentID": "b508f9df-799b-4120-a13e-5d09f2931fa6",
   "currency": "USD",
   "amount": "1200.35",
   "merchant": "Merchant A",
   "claims": {
      "openbanking_intent_id": "b508f9df-799b-4120-a13e-5d09f2931fa6"
   }
}
サンプル・マッピング・ルール

statements:
- if:
    match: "!has(requestContext.claims_idtoken_openbanking_intent_id)"
    return: null
- context: "intentID := requestContext.getValue('claims_idtoken_openbanking_intent_id')"
- context: 'intentContext := hc.getAsJSON("https://resource.myaspsp.com/internal/intents/" + context.intentID, { "Authorization": "apikey supersecretapikey" })'
- return: >-
    {
        "type": context.intentContext.type,
        "intentID": context.intentID,
        "currency": context.intentContext.instructedAmount.currency,
        "amount": context.intentContext.instructedAmount.amount,
        "merchant": context.intentContext.creditorName,
        "claims": {
            "openbanking_intent_id": context.intentID
        }
    }

同意ページのカスタマイズ

トランザクション承認の同意ユーザーエクスペリエンスは、標準のOAuthおよびOpenID Connectスコープ同意とは異なるため、同意ページテンプレートにカスタムセクションを作成できます。 詳細は「ページ OpenID 向けシングルサインオンの変更」 を参照してください。

例えば、以下のとおりです。

[RPT purpose_payment_initiation]
<input type="hidden" name="@PRIVACY_SCOPE_PNAME_REPEAT@"
    value="@PRIVACY_SCOPE_REPEAT@" privacy-readonly="true" />
<input type="hidden" id="@PRIVACY_SCOPE_PNAME_REPEAT@_state" name="@PRIVACY_SCOPE_PSTATE_REPEAT@"
    value="CONSENT_ALLOW" privacy-required="@PRIVACY_SCOPE_REQUIRED_REPEAT@" />
<div id="@PRIVACY_SCOPE_PNAME_REPEAT@_widget" class="bx--form-item" style="width:350px;"></div>
<div class="bx--grid" style="padding-left:0">
    <div class="bx--row" style="padding-bottom:6px;">
    <div class="bx--col-sm-1">Amount</div>
    <div class="bx--col">@PRIVACY_SCOPE_CUSTOM_currency@ @PRIVACY_SCOPE_CUSTOM_amount@</div>
    </div>
    <div class="bx--row" style="padding-bottom:6px;">
    <div class="bx--col-sm-1">Merchant</div>
    <div class="bx--col">@PRIVACY_SCOPE_CUSTOM_merchant@</div>
    </div>
    <div class="bx--row" style="padding-bottom:6px;">
    <div class="bx--col-sm-1">Reference</div>
    <div class="bx--col">@PRIVACY_SCOPE_ATTRVALUE_REPEAT@</div>
    </div>
</div>
[ERPT purpose_payment_initiation]
以下の点に注意してください。
  • 特定のデータ・プライバシーの目的で使用される新しい反復可能セクション。 使用される名前は、purpose_{purposeID}の形式に従います。 purposeIDは、データ・プライバシーの目的 ID です。 この目的 ID は、システム生成またはユーザー提供にすることができます。
  • 2 つの HTML フォーム・フィールドは必須であり、@PRIVACY_SCOPE_PNAME_REPEAT@および@PRIVACY_SCOPE_PNAME_REPEAT@_stateという名前です。 最初のフィールドには、同意レコードのVerify ID が含まれます。 2 番目のフィールドには、同意の状態が含まれます。
  • 拡張規則によって返されるカスタム属性は、マクロ@PRIVACY_SCOPE_CUSTOM_{attributeName}@を使用して参照できます。 例えば、@PRIVACY_SCOPE_CUSTOM_currency@は、インテント拡張ルールで返される通貨値に置き換えられます。