Apresentação de comprovante de posse ( DPoP )

DPoP fornece um mecanismo para que um cliente obtenha tokens de autenticação ( OAuth ) restritos ao remetente, mediante a apresentação de uma prova de posse de um par de chaves pública-privada.

A especificação está em fase de rascunho: https://datatracker.ietf.org/doc/html/draft-ietf-oauth-dpop-11.

DPoP HTTP cabeçalho

O cabeçalho ` DPoP ` é um JWT assinado que inclui informações essenciais para comprovar a posse.

O cabeçalho JOSE do JWT DPoP deve conter, no mínimo, os seguintes parâmetros:

Parâmetro Descrição
tipo O tipo de JWT. Esse valor deve ser "dpop+jwt".
ALG O algoritmo de assinatura. Os valores válidos são: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512
JWK Uma chave JSON Web (JWK) que representa a chave pública. Não deve conter uma chave privada.

Exemplo de cabeçalho JOSE:

{
  "typ": "dpop+jwt",
  "alg": "RS256",
  "jwk": {
    "kty": "RSA",
    "n": "...",
    "e": "AQAB"
  }
}

A carga útil do JWT de autenticação ( DPoP ) deve conter, no mínimo, as seguintes reivindicações:

Nome da reclamação Descrição
jti Identificador único para este JWT.
htm O método ` HTTP ` da solicitação à qual o JWT está anexado.
htu O URI de destino HTTP, sem as partes de consulta e fragmento. Esse seria o endpoint de solicitação de autorização enviada (PAR) ou o endpoint de token.
iat Data e hora de criação do JWT.

Exemplo de payload JWT:

{
  "jti": "3765f59c-43cd-4cf8-8180-73bc9ae4ff3c",
  "htm": "POST",
  "htu": "https://<tenant-hostname>/oauth2/token",
  "iat": 1661847227
}

O JWT do tipo “ DPoP ” deve ser assinado com uma chave privada, e a assinatura deve ser verificável com a chave pública fornecida no cabeçalho JOSE do JWT. O JWT não deve ter validade superior a 30 minutos. Se não houver nenhuma exp solicitação, presume-se que o prazo de validade deste JWT seja de 30 minutos após o carimbo de data/hora de criação especificado em iat.

O JWT é enviado em um cabeçalho chamado DPoP.

Exemplo de solicitação:


curl -ki https://<tenantId>/oauth2/token
 -H "DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6Il..."
 -d "grant_type=client_credentials&client_secret=<secret>&client_id=<clientId>"

Autorizar solicitação

A solicitação de autorização inclui uma impressão digital da JSON Web Key, no parâmetro de consulta ou no corpo da solicitação POST.

Parâmetro Descrição
dpop_jkt Impressão digital da chave JSON Web a ser associada a esta solicitação de autorização.
https://<tenantId>/oauth2/authorize?grant_type=authorization_code&client_id=<clientId>&redirect_uri=<redirect_uri>&dpop_jkt=<dpop_jkt>&...

O código de autorização gerado para esta solicitação seria vinculado a essa impressão digital e utilizado para validação na solicitação do token. Isso impede que o código de autorização seja roubado e utilizado por qualquer outra entidade que não possua a mesma chave privada para assinar a solicitação de token ao trocar o código por tokens.

Recomenda-se utilizar Solicitações de Autorização Enviadas (PAR) ou objetos de solicitação em conjunto com o serviço de certificação digital ( DPoP, ) para enviar a dpop_jkt impressão digital de forma segura. Como alternativa, com o PAR, é possível usar o cabeçalho ` DPoP ` em vez de dpop_jkt. Consulte DPoP HTTP header a seção acima para obter mais detalhes. As solicitações de autorização enviadas podem ser aplicadas selecionando-se a opção Require pushed authorization request (PAR) durante a configuração do aplicativo OpenID Connect.

Solicitação de token

As solicitações de token de acesso e de atualização devem incluir o cabeçalho ` DPoP ` HTTP. Consulte DPoP HTTP header a seção acima para obter mais detalhes.

No fluxo do código de autorização, a impressão digital deste JWK deve corresponder à impressão digital do JWK (dpop_jkt) enviada durante a solicitação de autorização.

Exemplo de solicitação:


curl -ki https://<tenantId>/oauth2/token
 -H "DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6Il..."
 -d "grant_type=client_credentials&client_secret=<secret>&client_id=<clientId>"

O resultado da execução desse fluxo é um conjunto de tokens vinculados à prova de posse. Isso pode ser verificado por meio da introspecção do token.

Introspecção de tokens

Quando um token de acesso do tipo ` DPoP ` é analisado, são retornadas reivindicações adicionais.
  • token_type: Em vez de bearer, esse valor seria DPoP.
  • cnf: A função de confirmação de impressão digital JWK retorna um hash da chave pública.
Espera-se que os clientes que realizam a introspecção do token validem a ligação DPoP do token de acesso, comparando o hash da chave pública com a cnf jkt reivindicação na resposta da introspecção.

Exemplo de resposta de introspecção:


{
    ...,
    "cnf": {
        "jkt": "yrFAH18WFPml9e9IIo6rB_fLdFX1pdbMgIcd_fW_4aM="
    },
    "token_type": "DPoP",
    ...
}