ID de intenção do Open Banking de mapeamento de solicitação do OpenID Connect

Quando um aplicativo de terceiros deseja iniciar uma transação que requer autorização do usuário (por exemplo, transferência de pagamento), ele usa uma API que é fornecida pela instituição financeira ou banco para registrar os detalhes da transação. Por exemplo, ele registra a quantia da transação e o tipo de moeda. Esse processo, às vezes, é chamado de "alojar uma intenção". A API responde com um identificador de intenção, também chamado de ID de consentimento em especificações de Open Banking do Reino Unido. O aplicativo inicia um fluxo de código de autorização OAuth para obter a autorização do usuário que é registrada como um consentimento do usuário.

Como a carga útil que representa a transação e o processo de inclusão do ID de intenção na solicitação de autorização não está bem definido, um administrador pode usar IBM® Verify para fazer script das ações a seguir usando uma regra customizada.
  • Extraia o ID de intenção da solicitação.
  • Obtenha as informações de contexto de intenção, geralmente chamando a API do banco.
  • Escolha como representar a autorização no id_token como um valor de solicitação ou escopo.
A regra customizada é baseada na sintaxe que é descrita em Executor de regras multilinhas. Regras mais simples podem ser de linha única e não precisam ser gravadas no formato YAML.

Objetos de entrada disponíveis

Como essa regra customizada é executada após a autenticação, mas antes da autorização, as informações que estão disponíveis não incluem todos os objetos de domínio possíveis. Eles são limitados aos tipos a seguir.

Contexto de solicitação de HTTP
Quando um usuário efetua o login no Verify, o contexto de solicitação HTTP recebida pode ser acessado na regra de mapeamento de solicitação. Todos os parâmetros de solicitação de OAuth, como claims e scope, estão disponíveis neste requestContext. A estrutura geral e o uso de requestContext são descritos na seção “Contexto de solicitação do HTTP ” do documento “ r_attr_functions.html ”.
Pela simplicidade de acesso, certos valores são pré-calculados no requestContext. O parâmetro de solicitação claims geralmente é representado como um JSON como o exemplo a seguir.

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

Esse JSON pode ser incômodo de acessar e por isso a chave que é usada no requestContext está no formato claims_claimType_claimName. O claimType é userinfo ou idtoken. Observe o sublinhado ausente. Assim, com o exemplo anterior, o valor claim_name pode ser obtido usando requestContext.getValue('claims_idtoken_claim_name').

Da mesma forma, scope é calculado e dividido por um espaço para construção de uma matriz de sequência.

Credencial de origem de identidade

Quando um usuário efetua login no Verify, os atributos de credencial de origem de identidade são incluídos na sessão de login e podem ser acessados na regra de mapeamento de solicitação.

O objeto de domínio idsuser está disponível como um mapa com uma chave de sequência e um valor de matriz de sequência. Por exemplo,

{
  "realmName": ["cloudIdentityRealm"],
  "displayName": ["Jessica J. Hill"],
  "phone": ["+12324321234"]
}
Para mais informações, consulte r_attr_functions.html.
Outras funções e operadores

Operadores e funções padrão estão disponíveis na regra de mapeamento. O cliente HTTP também está disponível para fazer solicitações de saída. Outras funções suportadas incluem hashing e registros de data e hora. Consulte as seções pertinentes do Manual de Normas de Execução ( r_attr_functions.html ).

Objeto de retorno

Como esta regra customizada deve ser interpretada para construir um contexto de autorização, o valor de retorno desta regra deve ser um objeto JSON que deve incluir as propriedades obrigatórias a seguir:

Propriedade Tipo Obrigatório? Descrição
type Sequência Sim O tipo indica o tipo de transação que está sendo realizada. Por exemplo, uma iniciação de pagamento. Isso é representado no Verify como um Propósito de privacidade de dados. O ID do propósito que é fornecido ou gerado pelo sistema é o valor de type.
intentID Sequência Sim O ID de intenção deve ser fornecido. Ele geralmente é calculado por meio de requestContext.
claims Objeto JSON. O valor da propriedade JSON pode ser de qualquer tipo. Não Geralmente, na autorização do usuário, o token de ID gerado contém alguma indicação de que o usuário autorizou a transação que é identificada pelo ID de intenção. O claims é um objeto ou mapa JSON, no qual a chave é o nome da solicitação e o valor pode ser qualquer estrutura compatível com JSON, como sequência, número inteiro, outro objeto, matriz ou outras estruturas. Várias solicitações também podem ser especificadas.
scope Sequência Não Se a solicitação for autorizada, esse valor será incluído nos escopos concedidos.

Quaisquer atributos adicionais, como a quantia ou a moeda são tratados como atributos customizados. Eles podem ser mostrados na página de consentimento do usuário usando as macros de modelo correspondentes que são descritas posteriormente.

Exemplo do UK Open Banking

Para iniciar um pagamento, uma intenção deve ser apresentada primeiro. Os participantes a seguir estão envolvidos neste cenário:
  • Um provedor de serviços de iniciação de pagamento (PISP) que reside no provedor de terceiros e inicia a transação de pagamento.
  • Um servidor de autorização do provedor de serviços de informações de conta (ASPSP). Nesse cenário, o ASPSP é Verify.
  • Um servidor de recursos ASPSP que hospeda a API de iniciação de pagamento.
O PISP redireciona o usuário para realizar a autorização com relação ao servidor de autorização, juntamente com o ID de intenção. O servidor de autorização precisa executar as tarefas a seguir:
  1. Extraia o ID de intenção.
  2. Recupere as informações sobre esta transação por meio do servidor de recursos.
Esta regra customizada executa ambas as operações.
Extraindo o ID de intenção da solicitação
Este exemplo segue o padrão do UK Open Banking de enviar o ID de intenção por meio do claims. A solicitação de autorização recebida contém o openbanking_intent_id nas solicitações.

{
	"id_token": {
		"openbanking_intent_id": {
			"value": "b508f9df-799b-4120-a13e-5d09f2931fa6",
			"essential": true
		}
	}
}
As solicitações são extraídas e disponibilizadas no contexto de solicitação. O código que é usado para recuperar o valor é

requestContext.getValue('claims_idtoken_openbanking_intent_id')
Recuperar informações da transação
As informações da transação são armazenadas no servidor de recursos do provedor de serviços de pagamento de manutenção de conta (ASPSP), que é onde o ID de consentimento ou intenção foi gerado. Use o cliente HTTP para fazer uma solicitação ao servidor de recursos. A solicitação a seguir é um exemplo.
hc.getAsJSON("https://resource.myaspsp.com/internal/intents/" + context.intentID
Mapear transação para um propósito de privacidade e solicitações
Para capturar a iniciação de pagamento do Open Banking e os consentimentos de acesso à conta, devem ser criados propósitos de privacidade relevantes. Por exemplo, um propósito de privacidade payment_initiation deve ser criado para quaisquer solicitações de consentimento de iniciação de pagamento. Esse propósito é então mapeado para a propriedade type no objeto de retorno.
Além disso, para o UK Open Banking, uma solicitação openbanking_intent_id precisa ser criada. As demais informações sobre a transação também podem ser incluídas no objeto de retorno.

{
   "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"
   }
}
Regra de mapeamento de amostra

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
        }
    }

Customizando a página de consentimento

Como a experiência do usuário no consentimento para autorização de transações difere do consentimento de escopo padrão do OAuth e do Open ID Connect, é possível criar uma seção personalizada no modelo da página de consentimento; consulte “Modificar o logon único para páginas OpenID ”.

Por exemplo,

[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]
Observe os aspectos a seguir.
  • Uma nova seção repetível que é usada para um propósito específico de privacidade de dados. O nome que é usado segue o formato purpose_{purposeID}. O purposeID é o ID de propósito de privacidade de dados. Esse ID de propósito pode ser gerado pelo sistema ou fornecido pelo usuário.
  • Dois campos de Formulário HTML são essenciais e são denominados @PRIVACY_SCOPE_PNAME_REPEAT@ e @PRIVACY_SCOPE_PNAME_REPEAT@_state. O primeiro campo contém o identificador Verify para o registro de consentimento. O segundo campo contém o estado de consentimento.
  • Atributos customizados que são retornados pela regra avançada podem ser referenciados usando a macro @PRIVACY_SCOPE_CUSTOM_{attributeName}@. Por exemplo, @PRIVACY_SCOPE_CUSTOM_currency@ é substituído pelo valor da moeda que é retornado na regra avançada de intenção.