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
- 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.
Exemplo de resposta de introspecção:
{
...,
"cnf": {
"jkt": "yrFAH18WFPml9e9IIo6rB_fLdFX1pdbMgIcd_fW_4aM="
},
"token_type": "DPoP",
...
}