Self Signed TLS Client Auth
Pré-requisitos:
- Configurações básicas
- Verificar se o método de autenticação é valido
- Valor "code" retornado pelo endpoint authorize
- Server configurado para conexões HTTPS
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
- key:
- Obrigatório: Sim
- Tipo: String
- Localização: Header da requisição.
- Descrição: Chave vinculada ao certificado autoassinado registrado no JWK do client
- cert:
- Obrigatório: Sim
- Tipo: String
- Localização: Header da requisição.
- Descrição: Certificado autoassinado registrado no client através do JWK
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 self_signed_tls_client_auth
a autenticação é realizada passando o par chave/certificado no header da requisição
Gerando e registrando um certificado autoassinado
- Gerando o certificado
openssl req -x509 -newkey rsa:2048 -keyout client_key.pem -out client.pem -sha256 -days 365
Gerando JWK (Json Web Key)
- Extraia a chave pública do certificado
openssl pkey -pubout -in client_key.pem > client_public_key.pem
Para gerar o JWK utilizaremos o seguinte site: https://irrte.ch/jwt-js-decode/pem2jwk.html
Após o site gerar o jwk, copie e armazene-o em um arquivo
touch client.jwk #cole o jwk gerado pelo site sudo vi client.jwk
- Por fim, incluímos o certificado no JWK através do parâmetro
x5c
CERT=$(sed /-/d client.pem | tr -d \\n) jq ".+{\"x5c\":[\"$CERT\"]}" client.jwk > client_cert.jwk
- Extraia a chave pública do certificado
Registrando o JWK no client
- O JWK é registrado no client que previamente foi definido com o método de autenticação
self_signed_tls_client_auth
. Para recordar como se atualiza um client, acesse aqui: Atualizando Clients
- Além de registrar o JWK também é necessario especificar um SAN field (Subject Alternative Name) para validar o certificado. No exemplo, iremos usar o email que foi registrado na criação do certificado.
- Para extrair SAN fields do certificado basta rodar o seguinte comando:
openssl x509 -noout -text -in client.pem
- Para extrair SAN fields do certificado basta rodar o seguinte comando:
- O JWK é registrado no client que previamente foi definido com o método de autenticação
- Gerando o certificado
Exemplo de uma requisição usando
self_signed_tls_client_auth
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 \ --cert $CERT \ --key $KEY \ -d grant_type=authorization_code \ -d client_id=<client_id> \ -d code=<auth_code> \ -d redirect_uri=<redirect_uri>
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" }