Configuração OAuth
Alguns drivers (como Bling) requerem autorização OAuth 2.0 antes de começar a receber events. Este guia explica o fluxo completo.
Quando é Necessário OAuth?
O OAuth é necessário quando a resposta de criação da instalação retorna:
{ "data": { "id": "0192abcd-1234-5678-9abc-def012345678", ... }, "needs_setup": true, "setup_type": "oauth", "setup_data": { "oauth_authorization_url": "https://..." }}Visão Geral do Fluxo
sequenceDiagram
participant User as Usuário
participant YourApp as Sua Aplicação
participant II as Integrações Inteligentes
participant Provider as Provedor (ex: Bling)
User->>YourApp: Clicar em "Conectar"
YourApp->>II: POST /installations
II-->>YourApp: needs_setup: true<br>oauth_authorization_url
YourApp->>User: Redirecionar para oauth_authorization_url
User->>Provider: Login & Autorização
Provider->>II: Callback com Authorization Code
II->>Provider: Exchange Code → Access Token
II-->>YourApp: Redirect para redirect_url
YourApp->>II: GET /installations/{id}
II-->>YourApp: needs_setup: false ✓
Configuração Inicial
1. Configurar Driver Settings
Antes de criar a instalação, configure o redirect_url:
curl -X PUT "https://api.integracoesinteligentes.com/drivers/{driver_id}/settings" \ -H "Authorization: Bearer <seu-token>" \ -H "Content-Type: application/json" \ -d '{ "oauth_settings": { "redirect_url": "https://sua-app.com/oauth/callback" } }'Importante:
O
redirect_urlé obrigatório para drivers OAuth. A API redirecionará o navegador para esta URL após completar o OAuth.
2. Criar instalação
curl -X POST https://api.integracoesinteligentes.com/installations \ -H "Authorization: Bearer <seu-token>" \ -H "Content-Type: application/json" \ -d '{ "integration_driver_id": "01ke7rhnt6fhb6tsbbhcdpepyb", "description": "Minha conta Bling", "processing_method": "complete" }'Resposta:
{ "data": { "id": "0192abcd-1234-5678-9abc-def012345678", "description": "Minha conta Bling", "integration_driver_id": "01ke7rhnt6fhb6tsbbhcdpepyb", ... }, "needs_setup": true, "setup_type": "oauth", "setup_data": { "oauth_authorization_url": "https://bling.com.br/Api/v3/oauth/authorize?client_id=...&state=...&redirect_uri=..." }}Fluxo de Autorização
3. Redirecionar Usuário
Abra oauth_authorization_url no navegador do usuário:
// Frontend JavaScriptconst response = await fetch("/api/create-installation", { method: "POST" });const data = await response.json();
if (data.needs_setup && data.setup_type === "oauth") { // Abre popup ou redireciona window.location.href = data.setup_data.oauth_authorization_url;}Ou para popup:
const popup = window.open( data.setup_data.oauth_authorization_url, "oauth", "width=600,height=700",);4. Callback e Redirecionamento
Após o usuário autorizar no provedor:
- O provedor redireciona para a API:
GET /installations/oauth?state=...&code=... - A API troca o code por access token
- A API redireciona o navegador para sua URL configurada:
https://sua-app.com/oauth/callback?installation_id=0192abcd-...&oauth_succeeded=trueOu em caso de erro:
https://sua-app.com/oauth/callback?installation_id=0192abcd-...&oauth_succeeded=false&oauth_failed_reason=<reason>Motivos de Falha OAuth
Quando oauth_succeeded=false, um parâmetro oauth_failed_reason pode estar presente:
| Reason | Descrição |
|---|---|
invalid_oauth_code | O código de autorização estava ausente ou vazio |
account_not_found | Não foi possível recuperar o ID da conta do provedor |
account_connected_to_other_installation | Já existe uma instalação conectada a esta conta do provedor |
unknown_exception | Erro inesperado durante o setup |
Exemplo de redirect com falha:
https://sua-app.com/oauth/callback?installation_id=0192abcd-...&oauth_succeeded=false&oauth_failed_reason=account_not_found5. Verificar Status
Após o callback, verifique se o setup foi concluído:
curl -X GET "https://api.integracoesinteligentes.com/installations/0192abcd-..." \ -H "Authorization: Bearer <seu-token>"Resposta de sucesso:
{ "data": { "id": "0192abcd-1234-5678-9abc-def012345678", ... }, "needs_setup": false}Implementação Completa (Exemplo)
Backend (Node.js/Express)
// Criar installationapp.post("/api/installations", async (req, res) => { const response = await fetch( "https://api.integracoesinteligentes.com/installations", { method: "POST", headers: { Authorization: `Bearer ${req.session.apiToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ integration_driver_id: req.body.driverId, description: req.body.description, processing_method: "complete", }), }, );
const data = await response.json();
if (data.needs_setup && data.setup_type === "oauth") { // Armazena installation_id na sessão req.session.pendingInstallationId = data.data.id;
return res.json({ needsSetup: true, authorizationUrl: data.setup_data.oauth_authorization_url, }); }
res.json({ installation: data.data });});
// Callback OAuthapp.get("/oauth/callback", (req, res) => { const { installation_id, oauth_succeeded } = req.query;
if (oauth_succeeded === "true") { // Limpa sessão delete req.session.pendingInstallationId;
// Redireciona para sucesso res.redirect("/integrations?status=connected"); } else { res.redirect("/integrations?status=error"); }});Frontend (React)
function ConnectIntegration({ driverId }) { const [loading, setLoading] = useState(false);
const handleConnect = async () => { setLoading(true);
try { const response = await fetch("/api/installations", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ driverId, description: "Minha conta" }), });
const data = await response.json();
if (data.needsSetup) { // Abre popup para OAuth const popup = window.open( data.authorizationUrl, "oauth", "width=600,height=700", );
// Monitora quando o popup fecha const checkClosed = setInterval(() => { if (popup.closed) { clearInterval(checkClosed); // Recarrega lista de installations window.location.reload(); } }, 500); } else { // Conectado sem OAuth window.location.reload(); } } catch (error) { console.error("Erro:", error); } finally { setLoading(false); } };
return ( <button onClick={handleConnect} disabled={loading}> {loading ? "Conectando..." : "Conectar"} </button> );}Scopes de Permissão
Cada provedor define seus próprios scopes. Geralmente você precisa de:
- Bling:
produtos,pedidos,estoques,vendas - Verifique a documentação específica de cada provedor
Tokens e Renovação
Access Token
- Obtido automaticamente após o OAuth
- Armazenado de forma segura pela plataforma
- Nunca exposto na API
Refresh Token
- Usado para renovar access tokens expirados
- Processo automático (agendado a cada 5 minutos)
- Você não precisa gerenciar manualmente
Drivers que Usam OAuth
Atualmente, os seguintes drivers requerem OAuth:
| Driver | URL de Autorização |
|---|---|
| Bling | Bling OAuth 2.0 |
Verifique sempre a resposta da API (needs_setup) para saber se é necessário.
Próximos Passos
- Configurar Integração - Revisão completa
- Receber Eventos - Processar events
- API de Drivers - Documentação da API
- Troubleshooting - Resolução de problemas