OpenID Connect 요청 맵핑 오픈 뱅킹 목적 ID

써드파티 애플리케이션이 사용자 권한 부여(예: 지불 전송)를 필요로 하는 트랜잭션을 시작하려는 경우, 금융 기관 또는 은행에서 제공하는 API를 사용하여 트랜잭션의 세부사항을 등록합니다. 예를 들어, 트랜잭션의 양과 통화 유형을 등록합니다. 이 과정은 때로 "숙박 의도"라고 합니다. API는 UK Open Banking 스펙에서 Consent ID라고 하는 의도 식별자로 응답합니다. 애플리케이션은 사용자 승인으로 기록되는 사용자 권한을 가져오기 위해 OAuth 권한 코드 플로우를 시작합니다.

트랜잭션을 나타내는 페이로드와 권한 요청의 의도 ID를 포함하는 프로세스가 잘 정의되지 않았기 때문에 관리자는 IBM® Verify을(를) 사용하여 사용자 정의 규칙을 사용하여 다음 조치를 스크립트할 수 있습니다.
  • 요청에서 의도 ID를 추출합니다.
  • 일반적으로 은행의 API를 호출하여 의사 컨텍스트 정보를 얻습니다.
  • id_token에서 청구 또는 범위 값으로 권한을 표시하는 방법을 선택하십시오.
사용자 정의 규칙은 다중 행 규칙 실행 프로그램에 설명된 구문을 기반으로 합니다. 간단한 규칙은 단일 행이 될 수 있으며 YAML 형식으로 작성할 필요가 없습니다.

사용 가능한 입력 오브젝트

이 사용자 정의 규칙은 인증 후에 실행되지만 권한 부여 이전에 사용 가능한 정보는 가능한 모든 도메인 오브젝트를 포함하지 않습니다. 이는 다음 유형으로 제한됩니다.

HTTP 요청 컨텍스트
사용자가 Verify에 로그인하면 요청 맵핑 규칙에서 수신 HTTP 요청 컨텍스트에 액세스할 수 있습니다. 모든 OAuth 요청 매개변수(예: claimsscope)는 이 requestContext에서 사용 가능합니다. 의 requestContext 일반적인 구조와 사용법은 r_attr_functions.html 의 “ 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입니다. 누락된 밑줄을 참고하십시오. 따라서 이전 예를 사용하여 claim_name 값은 requestContext.getValue('claims_idtoken_claim_name') 값을 사용하여 얻을 수 있습니다.

마찬가지로, scope이(가) 계산되고 공백으로 분할되어 문자열 배열을 빌드합니다.

ID 소스 인증 정보

사용자가 Verify에 로그인하면 ID 소스 신임 정보 속성이 로그인 세션에 추가되고 요청 맵핑 규칙에서 액세스할 수 있습니다.

idsuser 도메인 오브젝트는 문자열 키 및 문자열 배열 값이 있는 맵으로 사용 가능합니다. 예를 들면 다음과 같습니다.

{
  "realmName": ["cloudIdentityRealm"],
  "displayName": ["Jessica J. Hill"],
  "phone": ["+12324321234"]
}
자세한 내용은 r_attr_functions.html 을 참조하십시오.
기타 함수 및 연산자

맵핑 규칙에서 표준 연산자 및 함수를 사용할 수 있습니다. 또한 HTTP 클라이언트를 사용하여 아웃바운드 요청을 할 수 있습니다. 지원되는 기타 기능에는 해싱 및 시간소인이 포함됩니다. 『 r_attr_functions.html 』의 관련 부분을 참조하십시오.

리턴 오브젝트

이 사용자 정의 규칙은 권한 컨텍스트를 빌드하기 위해 해석되어야 하므로 이 규칙의 리턴 값은 다음 필수 특성을 포함해야 하는 JSON 오브젝트이어야 합니다.

특성 유형 필수인지 여부 설명
type 문자열 유형은 수행 중인 트랜잭션의 유형을 표시합니다. 예를 들어, 지불 개시가 있습니다. 이는 데이터 개인정보 보호 용도로 표시됩니다. 시스템에서 제공하거나 생성하는 용도 ID는 type의 값입니다.
intentID 문자열 의사 ID를 제공해야 합니다. 일반적으로 requestContext에서 계산됩니다.
claims JSON 오브젝트. JSON 특성 값은 모든 유형이 될 수 있습니다. 아니오 일반적으로, 사용자 권한 상에서, 생성되는 ID 토큰은 사용자가 의도 ID에 의해 식별되는 트랜잭션을 허가했다는 일부 표시를 포함합니다. claims은(는) JSON 오브젝트 또는 맵이며 여기서 키는 청구 이름이고 값은 JSON 호환 가능 구조(예: 문자열, 정수, 다른 오브젝트, 배열 또는 기타 구조)가 될 수 있습니다. 다중 청구를 지정할 수도 있습니다.
scope 문자열 아니오 요청이 승인되면 이 값이 권한 부여된 범위에 추가됩니다.

금액 또는 통화와 같은 추가 속성은 사용자 정의 속성으로 처리됩니다. 나중에 설명되는 해당 템플리트 매크로를 사용하여 사용자 승인 페이지에 표시할 수 있습니다.

영국 오픈 뱅킹 예제

지불을 시작하려면 먼저 의사를 표시해야 합니다. 다음 참여자가 이 시나리오에 관련되어 있습니다.
  • 제3자 제공자에 상주하며 지불 거래를 시작하는 지불 개시 서비스 제공자(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')
트랜잭션 정보 검색
트랜잭션 정보는 계정 서비스 지불 서비스 제공자(ASPSP) 자원 서버에 저장되는데, 이는 동의 또는 의사 ID가 생성된 곳입니다. HTTP 클라이언트를 사용하여 자원 서버에 요청합니다. 다음 요청이 예제입니다.
hc.getAsJSON("https://resource.myaspsp.com/internal/intents/" + context.intentID
개인정보 보호정책 및 클레임에 대한 트랜잭션 맵핑
은행 지불 개시 및 계정 액세스 계약을 캡처하려면 관련 개인정보 보호정책을 작성해야 합니다. 예를 들어, 지불 시작 승인 요청에 대해 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 ’ 및 ‘Open ID Connect’ 범위 동의와 다르므로, 동의 페이지 템플릿에 사용자 지정 섹션을 생성할 수 있습니다. 자세한 내용은 ‘ OpenID 페이지의 싱글 사인온(SSO) 수정’을 참조하십시오.

예를 들면 다음과 같습니다.

[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는 시스템 생성 또는 사용자 제공일 수 있습니다.
  • 두 개의 HTML 양식 필드는 필수이며 이름은 @PRIVACY_SCOPE_PNAME_REPEAT@@PRIVACY_SCOPE_PNAME_REPEAT@_state입니다. 첫 번째 필드에는 승인 레코드의 Verify ID가 포함됩니다. 두 번째 필드에는 승인 상태가 포함됩니다.
  • 고급 규칙에 의해 리턴되는 사용자 정의 속성은 @PRIVACY_SCOPE_CUSTOM_{attributeName}@ 매크로를 사용하여 참조할 수 있습니다. 예를 들어, @PRIVACY_SCOPE_CUSTOM_currency@은(는) 의도 고급 규칙으로 리턴되는 통화 값으로 대체됩니다.