Client Secret JWT
Pré-requisitos:
- Configurações básicas
- Verificar se o método de autenticação é valido
- Valor "code" retornado pelo endpoint authorize
Token
URL de Documentação da API : /apidocs/#/OAuth2/post__application__oauth_token
Após o login do usuario com sucesso, voce deve pegar o valor do argumento code
e
dados do client cadastrado e consumir o endpoint https://[ip ou hostname (fqdn)]/<application name>/oauth/token
Parâmetros:
- application:
- Obrigatório: Sim
- Tipo: String
- Localização: Caminho da URL (Path)
- Descrição: Nome da aplicação a ser usada.
- client_id:
- Obrigatório: Sim
- Tipo: String
- Localização: No corpo da requisição JSON
- Descrição: ID do cliente a ser usado na geração do "code"
- code:
- Obrigatório: Sim
- Tipo: String
- Localização: No corpo da requisição JSON.
- Descrição: Codigo retornado no endpoint
authorize
- grant_type:
- Obrigatório: Sim
- Tipo: String
- Localização: No corpo da requisição JSON.
- Descrição: Grant type configurado no client
- redirect_uri:
- Obrigatório: Sim
- Tipo: String
- Localização: No corpo da requisição JSON.
- Descrição: Redirect uri enviado como parâmetro do endpoint
authorize
- client_assertion_type:
- Obrigatório: Sim
- Tipo: String
- Valor: urn:ietf:params:oauth:client-assertion-type:jwt-bearer
- Localização: No corpo da requisição JSON.
- Descrição: Constante especificada em https://datatracker.ietf.org/doc/html/draft-ietf-oauth-jwt-bearer#section-2.2
- client_assertion:
- Obrigatório: Sim
- Tipo: String
- Localização: No corpo da requisição JSON.
- Descrição: Contém o JWT assinado com client_secret.
No exemplo abaixo iremos utilizar o fluxo com o grant_type
sendo authorization_code
e o response_type
como code
Como o Token Endpoint Auth Method
foi definido no exemplo como client_secret_jwt
a autenticação é realizada a partir do jwt passado no parâmetro client_assertion
Estrutura de um JSON WEB TOKEN (JWT)
JWT Header | Explicação |
---|---|
{ "alg":"HS256", "typ":"JWT" } |
"alg": Algoritmo criptográfico usado na assinatura do JWT. Referência: https://www.rfc-editor.org/rfc/rfc7515#section-4.1.1 "typ": Tipo de mídia do JWT. Usado nas aplicações para distinguir estruturas de dados que podem conter outros objetos além de um JWT. Referência: https://www.rfc-editor.org/rfc/rfc7519#section-5.1 |
Payload (JWT Claims) | Explicação |
---|---|
{ "jti":"id_único" "iss":"client_id", "sub":"client_id", "aud":"token_endpoint", "iat":tempo_emitido, "exp":tempo_validade } |
"jti": Identificador único para o JWT. Referência: https://www.rfc-editor.org/rfc/rfc7519#section-4.1.7 "iss": Emissor do token. Referência: https://www.rfc-editor.org/rfc/rfc7519#section-4.1.1 "sub": Identifica a quem pertence o token. Referência: https://www.rfc-editor.org/rfc/rfc7519#section-4.1.2 "aud": Identifica os destinatários aos quais o JWT se destina. Referência: https://www.rfc-editor.org/rfc/rfc7519#section-4.1.3 "iat": Identifica o tempo em que o JWT foi emitido. Referência: https://www.rfc-editor.org/rfc/rfc7519#section-4.1.6 "exp": Identifica o tempo de validade do JWT. Referência: https://www.rfc-editor.org/rfc/rfc7519#section-4.1.4 |
Observação
O tempo dos campos "iat" e "exp" é um valor numérico JSON representando o número de segundos a partir de 1970-01-01T00:00:00Z UTC. Referência: NumericDateUsando utilitários do Linux para calcular "iat" e "exp"
- "iat": Tempo em que o token foi emitido
# +%s representa o número de segundos desde 1970-01-01T00:00:00Z UTC date +%s
"exp": Validade do token
# Para calcular a validade do token, adicione o número de segundos # que irão passar até que o token se torne inválido # No exemplo a seguir o token torna-se inválido 24hrs após sua emissão echo $((`date +%s`+86400))
- "iat": Tempo em que o token foi emitido
Gerando um JWT assinado com o
client_secret
a partir do algoritmo criptográfico HMAC SHA-256- Criar um utilitário para auxiliar a codificar os campos do JWT em formato base64Url
base64url::encode () { base64 -w0 | tr '+/' '-_' | tr -d '='; }
- Atribuir à uma variável o header do JWT codificado em base64Url
jwt_header=$(echo -n '{"alg":"HS256","typ":"JWT"}' | base64url::encode)
- Atribuir à uma variável o payload do JWT codificado em base64Url
jwt_payload=$(echo -n '{"iss":"client_id","iat":tempo_emitido,"exp":tempo_validade,"aud":"https://[ip ou hostname (fqdn)]/<application name>/oauth/token","sub":"client_id","jti":"id_único"}' | base64url::encode)
- Assinar o header e payload
jwt_signature=$(echo -n "${jwt_header}.${payload}" | openssl sha256 -hmac "client_id" -binary | base64url::encode)
- Criar o JWT
jwt="${jwt_header}.${jwt_payload}.${jwt_signature}"
- Criar um utilitário para auxiliar a codificar os campos do JWT em formato base64Url
Exemplo de uma requisição usando
client_secret_jwt
para autenticaçãocurl -X POST "https://[ip ou hostname (fqdn)]/<application name>/oauth/token" \ -H "accept: application/json" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d client_id=<client_id> \ -d code=<auth_code> \ -d grant_type=authorization_code \ -d redirect_uri=<redirect_uri> \ -d client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer \ -d client_assertion=<jwt_signed_with_client_secret>
O retorno desta chamada deve ser similar ao exemplo abaixo:
{ "access_token": "eyJhbGciOiJSUz[...]EoULcOD4XZtfsTq1j95bg", "expires_in": 3600, "scope": "profile", "token_type": "Bearer" }
UserInfo
URL de Documentação da API : /apidocs/#/OAuth2/get__application__oauth_userinfo
Para recuperar as informações do usuário, utilize o access_token
retornado pelo endpoint acima como valor do
header Authorization: Bearer <access_token>
Parâmetros:
- application name:
- Obrigatório: Sim
- Tipo: String
- Localização: Caminho da URL (Path)
- Descrição: O nome da aplicação a ser usada.
Exemplos:
Curl:
curl -X GET "https://[ip ou hostname (fqdn)]/<application name>/oauth/userinfo" \ -H "accept: application/json" \ -H "Authorization: Bearer <access_token>"
O retorno desta chamada deve ser similar ao exemplo abaixo:
{ "id": "09d97a66-da69-4049-9123-3fdd7c2c2738", "name": "userdocs", "sub": "09d97a66-da69-4049-9123-3fdd7c2c2738", "username": "userdocs" }