Autenticação

As rotas de autenticação da API: login e tokens, MFA, renovação de sessão e troca de senha.

O login devolve um token de acesso e um token de renovação. O token de acesso autentica as chamadas seguintes, no cabeçalho Authorization: Bearer. Todas as rotas ficam sob /api/auth.

Sessão

Login

Autenticação: pública, sem token. Acesso: qualquer usuário.

POST/api/auth/loginAutentica e devolve os tokens

Campos: username e password. Quando a instituição exige segundo fator, a resposta traz um desafio em vez dos tokens, a ser confirmado no MFA.

curl -X POST https://<host>/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username": "trader1", "password": "sua-senha"}'
{
  "access_token": "eyJhbGciOiJI...",
  "refresh_token": "b0f3...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_expires_at": "2026-07-10T21:00:00Z"
}

Segundo fator

MFA

Autenticação: verify-mfa é pública (usa o desafio do login); as demais exigem token. Acesso: o próprio usuário.

POST/api/auth/verify-mfaConfirma o desafio e devolve os tokens
POST/api/auth/mfa/enrollInicia o cadastro do segundo fator
POST/api/auth/mfa/enroll/verifyConclui o cadastro

Em verify-mfa, envie o challengeToken recebido no login e o code do aplicativo autenticador. O cadastro devolve o segredo e o provisioning_uri para gerar o QR code, e enroll/verify recebe o code para concluir.

{ "challengeToken": "c1a2...", "code": "123456" }

Sessão

Renovação e encerramento

Autenticação: ambas usam o token de renovação, não o de acesso. Acesso: o próprio usuário.

POST/api/auth/refreshEmite novos tokens a partir do refresh
POST/api/auth/logoutRevoga o token de renovação

As duas recebem o refreshToken. O refresh devolve um novo par de tokens; o logout encerra a sessão.

{ "refreshToken": "b0f3..." }

Senha

Troca de senha

Autenticação: me/password exige token; change-expired-password é pública. Acesso: o próprio usuário.

POST/api/auth/me/passwordTroca a própria senha
POST/api/auth/change-expired-passwordTroca uma senha expirada, no login

Em me/password, envie currentPassword e newPassword. A change-expired-password atende ao caso em que a senha expirou e precisa ser trocada antes de entrar, recebendo também o username.

{ "username": "trader1", "currentPassword": "senha-atual", "newPassword": "nova-senha" }