Pular para o conteúdo principal
Autenticação

Autenticação

Você recebe duas credenciais. Uma identifica sua conta e viaja em toda requisição; a outra nunca sai do seu servidor e serve para derivar uma assinatura HMAC-SHA256, que você envia como prova de posse.

10 min de leituraVale para v1 e v2

Se você ainda não gerou as credenciais, comece por Introdução e Primeiros Passos — lá o passo a passo vai do painel até o primeiro 200 em sandbox.

As duas credenciais

CredencialO que éOnde aparece
ACCESS_TOKENIdentificador de acessoNo header Authorization, em texto aberto
SECRET_KEYChave usada para calcular a assinaturaEm lugar nenhum da requisição — só no cálculo

Ambas são geradas no painel, em Configurações → Usuários, na edição do seu próprio usuário.

Headers obrigatórios

Toda requisição à API deve incluir estes três headers:

HeaderValorO que faz
AuthorizationBasic {ACCESS_TOKEN}Identifica quem está chamando
Key{HMAC_SIGNATURE}Prova que quem chama tem a chave secreta
cache-controlno-cacheImpede que um proxy no caminho devolva resposta em cache sem chegar na API
Authorization: Basic {ACCESS_TOKEN}
Key: {HMAC_SIGNATURE}
cache-control: no-cache

Como calcular a assinatura

A assinatura é um hash HMAC-SHA256 do ACCESS_TOKEN usando a SECRET_KEY como chave:

HMAC_SIGNATURE = HMAC-SHA256(ACCESS_TOKEN, SECRET_KEY)

Ou seja: a chave do HMAC é a SECRET_KEY e a mensagem é o ACCESS_TOKEN. Inverter os dois é o erro nº 1 da integração, e o sintoma é um fbk_001 constante.

O resultado deve ser uma string hexadecimal. Não use base64 ou qualquer outra codificação — a API espera e valida o hash em hexadecimal (hex digest).

O que a assinatura prova, e o que ela não prova

Ela prova que você possui a SECRET_KEY. Ela não assina o conteúdo da requisição — corpo, URL e horário não entram no cálculo. Por isso o valor é constante enquanto o par de credenciais existir: na prática é uma segunda credencial derivada, e merece o mesmo cuidado de armazenamento que a primeira.

Do lado prático, isso significa que você calcula a assinatura uma vez e reutiliza em todas as chamadas — não precisa recalcular a cada requisição.

A SECRET_KEY nunca entra na requisição — só o resultado do cálculo.

Exemplos de código

const crypto = require('crypto');

function calcularHmac(accessToken, secretKey) {
// chave = SECRET · mensagem = TOKEN · saída = hex
return crypto
.createHmac('sha256', secretKey)
.update(accessToken)
.digest('hex');
}

const accessToken = process.env.FROTA_ACCESS_TOKEN;
const secretKey = process.env.FROTA_SECRET_KEY;
const hmacKey = calcularHmac(accessToken, secretKey);

const headers = {
Authorization: `Basic ${accessToken}`,
Key: hmacKey,
'cache-control': 'no-cache',
};

Erros de autenticação

API v1 (formato fbk_xxx)

CódigoMensagemO que aconteceu
fbk_001Não autorizadoToken não encontrado, inválido ou assinatura HMAC incorreta
fbk_002Sem permissãoA conta não tem permissão para acessar a empresa
{
"message": "Não autorizado",
"error": true,
"code": "fbk_001"
}

O fbk_001 não distingue a causa — todos os casos abaixo devolvem exatamente essa resposta:

SintomaCausa provávelComo resolver
fbk_001 constanteChave e mensagem invertidas no HMACA chave é a SECRET_KEY, a mensagem é o ACCESS_TOKEN
fbk_001 constanteAssinatura em base64A API só aceita hexadecimal (digest('hex'))
fbk_001 constanteAlgoritmo erradoPrecisa ser sha256 — não sha1, não md5
fbk_001 constanteCredencial de outro ambienteChave de produção em sandbox devolve fbk_001
fbk_001 intermitenteNewline ou espaço no valor lido do ambienteAplique trim() no token e na chave
fbk_002Conta sem permissão para a empresaNão é problema de assinatura. Fale com o suporte

API v2 (formato RFC 7807)

A API v2 usa o mesmo mecanismo HMAC, mas retorna erros em um formato padronizado (RFC 7807):

typeStatusO que aconteceu
urn:frota162-api-v2:error:unauthorized401Header Authorization ou Key ausente, ou esquema inválido
urn:frota162-api-v2:error:authentication-failed401Assinatura HMAC incorreta ou token não reconhecido
{
"type": "urn:frota162-api-v2:error:authentication-failed",
"title": "Authentication Failed",
"status": 401,
"detail": "Invalid Key header",
"instance": "/v2/driver-indications",
"traceId": "abc123"
}

Para a lista completa de códigos, consulte Tratamento de Erros.


Segurança

  • Guarde ACCESS_TOKEN e SECRET_KEY em variável de ambiente ou gerenciador de segredos — nunca no código-fonte
  • Todas as chamadas via HTTPS (os endpoints da API já exigem)
  • A SECRET_KEY nunca deve chegar ao navegador do usuário nem aparecer em log de requisição
  • Em caso de comprometimento, gere novas credenciais imediatamente no painel

Lidar com rate limiting

Se a API retornar status 429 (muitas requisições), espere o tempo indicado no header Retry-After antes de tentar novamente:

async function fetchWithRetry(url: string): Promise<Response> {
const response = await fetch(url, {
headers: {
Authorization: `Basic ${credentials}`,
Key: hmacSignature,
},
});

if (response.status === 429) {
const retryAfter = parseInt(response.headers.get('Retry-After') || '60');
console.log(`Rate limited. Aguardando ${retryAfter}s...`);
await sleep(retryAfter * 1000);
return fetchWithRetry(url);
}

return response;
}

Login automático (POST /key/generator)

Quando usar

Esta rota não gera credenciais de API. Ela cria um token de sessão temporário que permite autenticar um usuário no sistema Frota162 sem que ele precise digitar email e senha.

Cenários de uso:

  • Iframe — embutir o sistema Frota162 dentro de outro sistema
  • SSO simplificado — redirecionar o usuário para o Frota162 já autenticado após login no sistema do cliente
  • Deep link autenticado — abrir uma tela específica do Frota162 sem exigir novo login

Como funciona:

  1. Seu backend faz um POST /key/generator com as credenciais HMAC normais
  2. A API retorna um token de sessão temporário (accessKey)
  3. Você redireciona o usuário (ou carrega o iframe) usando a URL:
    https://app.frota162.com.br/login?accessKey={TOKEN_GERADO}
  4. O Frota162 autentica o usuário automaticamente

Requisição:

curl -X POST \
https://apidev.v1.frota162.com.br/key/generator \
-H 'Authorization: Basic {ACCESS_TOKEN}' \
-H 'Key: {HMAC_SIGNATURE}' \
-H 'Content-Type: application/json' \
-d '{"email": "usuario@empresa.com", "password": "senha_do_usuario"}'

Resposta:

{
"accessKey": "7a12ad20-136f-4c06-9f40-532a6e952127",
"error": false,
"code": "fbk_200"
}
Atenção

O accessKey retornado é de uso único e expira após o login. Não confunda com o ACCESS_TOKEN usado para autenticar chamadas da API.

Próximos passos