OAuth 2.0 — Referência Técnica
Referência técnica do fluxo OAuth 2.0 Authorization Code Grant. Endpoints, parâmetros, respostas e códigos de erro.
Guia completo para integrar sua aplicação com o Bunto ERP usando OAuth 2.0 Authorization Code Grant. Permite que usuários autorizem acesso granular aos seus dados sem compartilhar credenciais.
Visão Geral
| Propriedade | Valor |
|---|---|
| Grant Type | Authorization Code (RFC 6749) |
| Prefixo Access Token | bnt_oat_ |
| Prefixo Refresh Token | bnt_ort_ |
| Expiração Access Token | 4 horas |
| Expiração Refresh Token | 30 dias |
| Transporte | Header Authorization: Bearer bnt_oat_xxx |
| Criptografia | Fernet (tokens nunca armazenados em texto puro) |
Quando usar OAuth? Use OAuth quando sua aplicação precisa acessar dados de outros usuários do Bunto ERP. Para integrações da própria empresa (server-to-server), prefira Tokens de API.
Base URLs
| Endpoint | URL | Descrição |
|---|---|---|
| Autorização | https://erp.bunto.com.br/oauth/autorizar/ | Redirecionar o usuário aqui (frontend) |
| Token | https://api-backend.bunto.com.br/integracoes/oauth/token/ | Trocar code por token (server-to-server) |
| Revogação | https://api-backend.bunto.com.br/integracoes/oauth/revoke/ | Revogar tokens (server-to-server) |
| API v1 | https://api-backend.bunto.com.br/v1/ | Usar access_token aqui |
Importante: A URL de autorização aponta para o frontend do ERP (não para a API). O frontend exibe a tela de consentimento e se comunica com a API internamente.
1. Registrar um Aplicativo
Antes de iniciar o fluxo OAuth, registre seu aplicativo no Bunto ERP:
- Acesse o painel do Bunto ERP
- Navegue até Integrações → Aplicativos OAuth
- Clique em Novo Aplicativo
- Preencha:
- Nome: Nome exibido na tela de consentimento
- Descrição: O que sua aplicação faz (exibido ao usuário)
- Redirect URIs: URLs de callback (HTTPS obrigatório em produção)
- Escopos: Permissões máximas que o app pode solicitar
- Copie o client_id e client_secret gerados
Importante: O client_secret é exibido apenas uma vez. Armazene-o em local seguro. Nunca exponha o secret no código-fonte ou frontend.
Você receberá:
codeclient_id: bnt_app_A1b2C3d4E5f6G7h8I9j0K1l2 client_secret: bnt_secret_X9y8Z7w6V5u4T3s2R1q0P9o8N7m6L5k4J3i2H1g0
2. Fluxo de Autorização
Passo 1: Redirecionar o Usuário
Redirecione o usuário para a tela de autorização do Bunto ERP:
codehttps://erp.bunto.com.br/oauth/autorizar/ ?client_id=bnt_app_xxx &redirect_uri=https://seuapp.com/callback &scope=produtos:read,vendas:read,vendas:write &state=random_csrf_string_123 &response_type=code
Parâmetros:
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
client_id | Sim | ID público do aplicativo |
redirect_uri | Sim | URL de callback (deve estar registrada) |
scope | Sim | Escopos solicitados (formato: modulo:acao) |
state | Sim | String aleatória para proteção CSRF |
response_type | Sim | Deve ser code |
Passo 2: Usuário Autoriza
O Bunto ERP exibirá uma tela de consentimento mostrando:
- Nome e descrição do seu aplicativo
- Escopos solicitados (ex: "Produtos - Leitura", "Vendas - Leitura e Escrita")
- Usuário e empresa conectados
O usuário pode Autorizar ou Negar o acesso.
Passo 3: Receber o Código
Após autorização, o usuário é redirecionado para sua redirect_uri:
https://seuapp.com/callback?code=bnt_code_xxx&state=random_csrf_string_123
Sempre valide o state! Compare o valor recebido com o que você enviou no Passo 1 para prevenir ataques CSRF.
Se o usuário negar:
https://seuapp.com/callback?error=access_denied&error_description=O+usu%C3%A1rio+negou+o+acesso&state=random_csrf_string_123
Passo 4: Trocar Código por Token
Faça um POST server-side (nunca do frontend!) para trocar o código por tokens:
bashcurl -X POST https://api-backend.bunto.com.br/integracoes/oauth/token/ \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'grant_type=authorization_code' \ -d 'code=bnt_code_xxx' \ -d 'client_id=bnt_app_xxx' \ -d 'client_secret=bnt_secret_xxx' \ -d 'redirect_uri=https://seuapp.com/callback'
Resposta (200 OK):
json{ "access_token": "bnt_oat_A1b2C3d4E5f6G7h8...", "token_type": "Bearer", "expires_in": 14400, "refresh_token": "bnt_ort_X9y8Z7w6V5u4T3s2...", "scope": "produtos:read,vendas:read,vendas:write" }
O código expira em 10 minutos e é de uso único. Troque-o imediatamente após recebê-lo.
3. Usando o Access Token
Use o access_token para acessar a API v1:
bashcurl https://api-backend.bunto.com.br/v1/produtos/ \ -H 'Authorization: Bearer bnt_oat_A1b2C3d4E5f6G7h8...' \ -H 'Content-Type: application/json'
O access token funciona exatamente como um Token de API, mas com escopos granulares:
- Requisições fora do escopo retornam
403 Forbidden - Módulos fora do plano da empresa retornam
403 Forbidden
4. Renovando o Access Token
Quando o access token expirar (4h), use o refresh token para obter um novo:
bashcurl -X POST https://api-backend.bunto.com.br/integracoes/oauth/token/ \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'grant_type=refresh_token' \ -d 'refresh_token=bnt_ort_X9y8Z7w6V5u4T3s2...' \ -d 'client_id=bnt_app_xxx' \ -d 'client_secret=bnt_secret_xxx'
Resposta (200 OK):
json{ "access_token": "bnt_oat_novo_token_aqui...", "token_type": "Bearer", "expires_in": 14400, "scope": "produtos:read,vendas:read,vendas:write" }
O refresh_token permanece o mesmo. Ele expira em 30 dias. Após expirar, o usuário precisa autorizar novamente.
5. Revogando Tokens
Para revogar um token (logout, desconexão):
bashcurl -X POST https://api-backend.bunto.com.br/integracoes/oauth/revoke/ \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'token=bnt_oat_A1b2C3d4E5f6G7h8...' \ -d 'client_id=bnt_app_xxx' \ -d 'client_secret=bnt_secret_xxx' \ -d 'token_type_hint=access_token'
Este endpoint sempre retorna 200 OK (mesmo se o token não existir), conforme RFC 7009.
Formato de Escopos
Escopos seguem o formato modulo:acao, separados por vírgula:
produtos:read,vendas:read,vendas:write,clientes:read
Ações disponíveis:
| Ação | Métodos HTTP | Descrição |
|---|---|---|
read | GET, HEAD, OPTIONS | Leitura de dados |
write | POST, PUT, PATCH | Criação e atualização |
delete | DELETE | Exclusão |
Módulos disponíveis:
Consulte o endpoint de escopos para ver os módulos disponíveis no plano da empresa:
bashcurl https://api-backend.bunto.com.br/integracoes/aplicativos/escopos/ \ -H 'Cookie: access_token=...'
Tratamento de Erros
Erros no Endpoint de Autorização
Redirecionados para redirect_uri (exceto erros de redirect_uri):
| Erro | Descrição |
|---|---|
invalid_request | Parâmetros faltando ou inválidos |
unauthorized_client | Aplicativo desativado |
invalid_scope | Escopos inválidos ou não permitidos |
unsupported_response_type | Apenas code é suportado |
access_denied | Usuário negou o acesso |
Erros no Endpoint de Token
Retornados como JSON com status HTTP 400 ou 401:
json{ "error": "invalid_grant", "error_description": "Código de autorização inválido ou expirado" }
| Erro | Status | Descrição |
|---|---|---|
invalid_client | 401 | client_id ou client_secret inválido |
invalid_grant | 400 | Código expirado, já usado, ou redirect_uri diferente |
unsupported_grant_type | 400 | Apenas authorization_code e refresh_token |
Segurança
Boas Práticas
- Nunca exponha o
client_secretno código frontend ou repositórios públicos - Sempre valide o
statepara prevenir CSRF - Troque o código imediatamente (expira em 10 minutos, uso único)
- Armazene tokens com segurança (banco de dados criptografado, nunca em localStorage)
- Use HTTPS em todas as redirect_uris (obrigatório em produção)
- Solicite apenas os escopos necessários (princípio do menor privilégio)
- Implemente refresh para manter acesso sem re-autorizar o usuário
Limites
| Recurso | Limite |
|---|---|
| Aplicativos por empresa | 5 |
| Redirect URIs por app | 5 |
| Código de autorização | 10 minutos, uso único |
| Access token | 4 horas |
| Refresh token | 30 dias |
| Rate limit (autenticação) | 20 falhas por IP → bloqueio 15min |
Revogação pelo Usuário
Usuários podem revogar o acesso do seu aplicativo a qualquer momento em Integrações → Aplicativos no painel do Bunto ERP. Quando revogado, todos os tokens associados são invalidados imediatamente.