Fluxos de Autorização e Autenticação
Saiba como começar a trabalhar com as nossas APIs
Protocolo OAuth2
O Oauth2 é um protocolo de autorização muito utilizado na indústria de tecnologia. Ele permite que uma aplicação se autentique na outra de forma segura. Esse protocolo soluciona justamente o cenário que iremos precisar aqui, afinal precisaremos que sua aplicação converse com a nossa aplicação da Cora. Para que sejam validadas essas trocas de informações, os sistemas precisam confiar um no outro. Para estabelecer esse vínculo de confiança utilizamos 2 dos fluxos definidos pelo protocolo OAuth2, o Authorization Code Flow(incluir link) e o Client Credentials.
Authorization Code
Como o próprio nome já diz, esse é um fluxo de autorização que produzirá como resultado um token de acesso ao sistema desejado, ou seja, o seu sistema terá acesso as APIs da Cora se percorrer com sucesso esse fluxo.
Para que é utilizado esse fluxo?
É utilizado para que o Cliente Final dê o consentimento para a Empresa Parceira possa executar ações na conta deste cliente. Após o consentimento a empresa parceira terá acesso por exemplo a artefatos de cobrança, pagamentos, além de dados sensíveis do Cliente Final.
Mas como funciona na prática?
Há várias descrições bem completas na internet, sobre os atores participantes do fluxo e diagramas de sequência, porém resolvemos simplificar no diagrama abaixo.
Vamos adotar algumas premissas para facilitar o exemplo:
-
O nome do seu sistema é SISPAR
-
Você deseja disponibilizar a emissão de boletos da Cora dentro de seu sistema
Bora pro código
Para exemplificar, iremos listar alguns parâmetros fictícios:
- Client-id: app-teste-doc
- Redirect URI: https://exemplo.com.br
- scopes: invoice, account, payment
Como você pôde perceber no diagrama, há 4 retângulos envolvendo algumas ações entre os atores. Abaixo, iremos listar e detalhar os passos na ordem correta.
1. Redirecionamento
Para direcionar o cliente para a Cora, é preciso que você monte o link com os parâmetros específicos de seu sistema. Veja só como ficaria o link para o client-id de exemplo:
https://api.stage.cora.com.br/oauth/authorize?client_id=app-teste-docs&response_type=code&redirect_uri=https://exemplo.com.br&scopes=invoice%20account%20payment
Tabela explicativa dos parâmetros:
Parâmetro | Valor | Comentário |
---|---|---|
client_id | app-teste-doc | Client ID que você receberá quando for aprovado e virar uma empresa Parceira da Cora |
response_type | code | Sempre o valor será code. Esse é um valor fixo |
redirect_uri | https://exemplo.com.br | Essa será a URI de seu sistema, para onde a Cora irá redirecionar o cliente após a autorização |
scopes | invoice/account/payment | Lista de escopos que você irá pedir autorização. O detalhamento dos escopos e quais recursos pode ser encontrado aqui |
Gestão de escopos
Escopo | Comentário |
---|---|
account | Solicita o acesso às APIs de extrato e dados de conta |
payment | Solicita o acesso às APIs de iniciação de pagamento |
transfer | Solicita o acesso às APIs de iniciação de transferência |
invoice | Solicita o acesso às APIs de boleto |
3. Volta para o sistema
Após a etapa anterior o Cliente Final é direcionado de volta para o sistema da Empresa Parceira e enviaremos como parâmetro da url, um código que a Empresa Parceira irá utilizar para pegar os tokens de acesso às APIs da Cora.
Trouxemos abaixo um exemplo de como virá o parâmetro code na URL:
https://exemplo.com.br/?session_state=18dc33de-d69f-4c16-ac1f-c1d0ac075712&code=006081d3-9f5a-41ac-80b1-c64888962332.18dc33de-d69f-4c16-ac1f-c1d0ac075712.3cfcfebb-6d4a-4845-91f9-d01572e8ce69
Tabela explicativa dos parâmetros:
Parâmetro | Valor | Comentário |
---|---|---|
host | https://exemplo.com.br | Essa é a URI de redirecionamento que você havia configurado no link de permissão |
session_state | 18dc33de-d69f-4c16-ac1f-c1d0ac075712 | Parâmetro utilizado pelos nossos sistemas da Cora. Não será utilizado Empresa Parceira. Pode ignorá-lo. |
code | 006081d3-9f5a-41ac-80b1-c64888962332.18dc33de-d69f-4c16-ac1f-c1d0ac075712.3cfcfebb-6d4a-4845-91f9-d01572e8ce69 | Esse código é importante. É ele que você utilizará no próximo passo para solicitar um par de tokens (access e refresh) e assim utilizar as APIs da Cora. Expira após 60 segundos. |
4. Autenticação
Com o parâmetro code capturado na URL de redirecionamento, será preciso fazer uma requisição para nosso Servidor de Autorização para solicitar os tokens de acesso. Veja abaixo um exemplo dessa requisição:
Campo | Comentário |
---|---|
Método | POST |
Endpoint | https://api.stage.cora.com.br/oauth/token |
cURL de exemplo:
curl --location --request POST 'https://api.stage.cora.com.br/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic YXBwLXRlc3RlLWRvYzo4MWQyMzFmNC1mOGU1LTRiNTItOWMwOC0yNGRjNDUzMjFhMTYK' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'code={{auth_code}}' \
--data-urlencode 'redirect_uri=https://exemplo.com.br'
Aqui temos algumas informações novas, vamos explicá-las na tabela abaixo:
Campo | Chave | Valor | Comentário |
---|---|---|---|
Header | Content-Type | application/x-www-form-urlencoded | Esse campo indica o formato da mensagem que deverá ser interpretada pelo servidor |
Header | Authorization | Basic YXBwLXRlc3RlLWRvYzo4MWQyMzFmNwOC0yNGRjNDUzMjFhMTYK | Explicação detalhada na sessão abaixo. |
Header | grant_type | authorization_code | Campo que indica o tipo de permissão OAuth2 escolhido. Nesse caso será authorization_code |
Body | code | Campo que indica o tipo de permissão OAuth2 escolhido. Nesse caso será authorization_code | Campo que indica o tipo de permissão OAuth2 escolhido. Nesse caso será authorization_code |
Body | redirect_uri | https://exemplo.com.br | Essa é a URI de redirecionamento que você havia configurado no link de permissão. Precisa ser a mesma URI. |
Campo Authorization no header
Esse campo é a uma concatenação de duas Strings. A primeira string "Basic" é fixa, mas a segunda é a junção de suas credenciais codificadas em base64. Trouxemos o exemplo:
Chave | Valor |
---|---|
Client-id | app-teste-doc |
Client-secret | 81d231f4-f8e5-4b52-9c08-24dc45321a16 |
Client-id:Client-secret | app-teste-doc:81d231f4-f8e5-4b52-9c08-24dc45321a16 |
Base64(Client-id:Client-secret) | YXBwLXRlc3RlLWRvYzo4MWQyMzFmNC1mOGU1LTRiNTItOWMwOC0yNGRjNDUzMjFhMTYK |
Para verificar se o código está correto, você pode executar o seguinte comando no terminal de seu computador, para fazer o encode em base64
echo "app-teste-doc:81d231f4-f8e5-4b52-9c08-24dc45321a16" | base64
Após enviar a requisição o Servidor de Autorização da Cora responderá com a seguinte mensagem:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJPUXhETFpxNmFJb1EzS1Q0dWFEWWhQai1IUUVpMm5iNGl1WEdWV0diVWh3In0.eyJleHAiOjE2NjM3Nzk5NTgsImlhdCI6MTY2MzY5MzU1OCwiYXV0aF90aW1lIjoxNjYzNjkzNTI5LCJqdGkiOiJiMDYzYjJhNi03OTdiLTQ4ZjQtYjQyMi1lYzczNTY4Yjc3ZGYiLCJpc3MiOiJodHRwczovL2F1dGguc3RhZ2UuY29yYS5jb20uYnIvcmVhbG1zL2NvcmEiLCJzdWIiOiJhcHAtYmVja2VyZXAiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJhcHAtYmVja2VyZXAiLCJzZXNzaW9uX3N0YXRlIjoiZDhlNzhmYTAtNWRlMi00MDE4LTkwOWItNDNjZjQ2YTYwMWVhIiwiYWNyIjoiMSIsInNjb3BlIjoib2ZmbGluZV9hY2Nlc3MiLCJzaWQiOiJkOGU3OGZhMC01ZGUyLTQwMTgtOTA5Yi00M2NmNDZhNjAxZWEiLCJjbnBqIjoiMTA4MTA4MzAwMDAxMzgiLCJidXNpbmVzc19pZCI6Ijc3Njc3Nzk0LTdkNWMtNGQ1YS1iYjdlLWE4MmE0NGU4ZDEzMCIsInBlcnNvbl9pZCI6IjQwNzFmMGZjLTk1MzctNDVhOC05ZWY2LTc3NDdjNTBmODM1YyJ9.R6oTl-Sb2N5brQh6qe9VB6pH7MOfneDAxpoC_cA3Hba7kzjG8RUlmDlOhciRgVbhmQKbwJlsEUpFbvKIwlr3GoPmnxIOTFihIfEG4xQ8eLw1275t8_dPyRy8DoLQF2GLYcFPIRHoxH2FXH5bzRu6D2n2G50SKgVJyhT_KegVEqAPcQq9Aii1FNGDGgt8qp2mbDiWq3B199QF7NkJFeo50qllflfVN5t7gCOonNfzhTLJAJ-KZuHA4__bwXxeKD9TI0rd4_gloHIxziTRqhkPjEBHAW8iLLI7REkOMvW8wFYegTbZSqhhAz7pEJnMAJq06MmVTPQmlq1_gg_THmY4AA",
"expires_in": 86400,
"refresh_expires_in": 0,
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5Y2JjMzEyZS04ODA2LTRiM2UtOWExMi1jMjg0NGQ2MjM0YjcifQ.eyJpYXQiOjE2NjM2OTM1NTgsImp0aSI6IjRlZDFmYzEzLTIyZjctNDU4Yy05Mzg2LWFkZTU5OTg1ZDNhYSIsImlzcyI6Imh0dHBzOi8vYXV0aC5zdGFnZS5jb3JhLmNvbS5ici9yZWFsbXMvY29yYSIsImF1ZCI6Imh0dHBzOi8vYXV0aC5zdGFnZS5jb3JhLmNvbS5ici9yZWFsbXMvY29yYSIsInN1YiI6ImFwcC1iZWNrZXJlcCIsInR5cCI6Ik9mZmxpbmUiLCJhenAiOiJhcHAtYmVja2VyZXAiLCJzZXNzaW9uX3N0YXRlIjoiZDhlNzhmYTAtNWRlMi00MDE4LTkwOWItNDNjZjQ2YTYwMWVhIiwic2NvcGUiOiJvZmZsaW5lX2FjY2VzcyIsInNpZCI6ImQ4ZTc4ZmEwLTVkZTItNDAxOC05MDliLTQzY2Y0NmE2MDFlYSJ9.c864NeMer1njXuoQ2m7YZQgvegLuOK5UpsshFWH8DOk",
"token_type": "Bearer",
"not-before-policy": 1614056798,
"session_state": "d8e78fa0-5de2-4018-909b-43cf46a601ea",
"scope": "offline_access"
}
Após receber o par de tokens é imprescindível que tanto o access_token quanto o refresh_token sejam persistidos, pois são eles que serão usados em nossas APIs.
Tabela explicativa dos campos da resposta
Campo | Comentário |
---|---|
access_token | É o campo mais importante da resposta. Esse é o token em formato JWT que será utilizado nas requisições as APIs da Cora. |
expires_in | Indica em segundos o tempo de expiração do Token. Nesse exemplo 24 horas. |
refresh_expires_in | O valor vem zerado, pois o refresh_token não expira por tempo e sim por quantidade de tentativas (3). |
refresh_token | Esse é o segundo campo mais importante da resposta. Esse token em formato JWT, irá nos ajudar quando o access_token expirar e precisarmos renovar de uma forma fácil, sem precisar direcionar o Cliente Final para refazer o fluxo de autorização. |
token_type | Campo que indica o tipo de autenticação do token. Normalmente, será indicado como "Bearer", um termo amplamente utilizado em autenticação HTTP, onde o cliente que possui o token pode acessar recursos protegidos enviando o token no cabeçalho da solicitação. |
scope | O valor do escopo offline_access indica que essa aplicação está configurada para retornar um refresh_token que não expira e tem persistência garantida no sistema. Porém é importante entender que ele tem um período de inatividade. Para proteção, o sistema não mantêm tokens que não estão sendo usados por um período maior que 60 dias. Caso não haja nenhum pedido para renovar o token em um período de 60 dias o sistema considera inativo e apaga a sessão do usuário. Você não irá utilizar essa informação. |
session_state | Parâmetro interno. Você não irá utilizar esse informação. |
not-before-policy | Parâmetro para uso interno. Se percebermos que houve comprometimento de algum token nós utilizamos esse parâmetro para invalidar todos os tokens gerados naquele período de tempo. Você não irá utilizar essa informação. |
5. Consumo do recurso
No diagrama de exemplo, colocamos como objetivo final o consumo da API de emissão de Boleto, mas poderia ser qualquer um dos recursos que temos disponíveis e que tem como exigência o Access Token, pois trafegam dados sensíveis de nossos Clientes Finais.
Veja a cURL de exemplo com parte da requisição para emissão de Boleto:
curl --location --request POST 'https://api.stage.cora.com.br/invoices' \
--header 'Idempotency-Key: 33766506-1850-42f6-a96a-bf2c67adb0e8' \
--header 'Authorization: Bearer {{access_token}}' \
--data-raw '{
"code": "meu_id",
...
}
}'
Perceba que é nesse momento que você irá utilizar o Access Token que seu sistema acabou de gerar. No header Authorization será necessário concatenar a String "Bearer" com o Access Token recebido: Bearer {{access_token}}
6. Renovação do Token
O Access Token é o elemento essencial. Sem ele não é possível acessar as APIs da Cora. Porém, ele tem um prazo relativamente curto para expirar (24 horas). Dessa maneira será preciso renová-lo constantemente.
O fluxo de renovação de token é muito simples. Basta fazer uma requisição utilizando o refresh_token que foi retornado na Autenticação (Passo 4).
Trouxemos como ficaria a requisição abaixo:
curl --location --request POST 'https://api.stage.cora.com.br/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic Base64(SEU_CLIENT_ID:SEU_CLIENT_SECRET)' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'refresh_token={{refresh_token}}'
Os campos Authorization e Content-Type também já foram mencionados no passo de Autenticação, porém há mudanças no corpo da mensagem
Campo | Chave | Valor | Comentário |
---|---|---|---|
Body | grant_type | refresh_token | Campo que indica o tipo de permissão OAuth2 escolhido. Nesse caso será refresh_token |
Body | refresh_token | eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5Y…. | JWT recebido no passo de Autenticação. Ele pode ser utilizado apenas 3 vezes. |
Após enviar a requisição acima, o nosso Servidor de Autorização irá responder a mesma mensagem do passo de Autenticação (Passo 4).
Updated 11 months ago