Autenticação

Login, renovação de token, logout e troca de organização da Plataforma Keeptor.

Autenticação

Endpoints de autenticação e gerenciamento de sessão da Plataforma Keeptor.

Fluxo básico

  1. Login (/login): usuário envia email + password (+ organization_id opcional se pertencer a múltiplas organizações)
  2. A API retorna access_token (validade 1 hora) e refresh_token
  3. Cliente armazena os tokens com segurança no escopo da sessão
  4. Toda chamada subsequente envia Authorization: Bearer <access_token>
  5. Antes do access_token expirar, cliente chama /refresh para obter um novo
  6. /logout encerra a sessão. A revogação é imediata: os demais endpoints passam a responder 401 para aquele token. Sair é idempotente: chamar /logout de novo com o mesmo token responde 200 com data.already_ended: true
  7. /switch-org: para usuários multi-organização, cria uma sessão nova na organização alvo

Boas práticas para o cliente

  • Renove de forma proativa: monitore a expiração do token e chame /refresh antes de receber 401
  • Trate 401 de forma uniforme: qualquer 401 significa sessão inválida: limpe o estado local e redirecione para o login
  • Não tente reutilizar um access_token após logout, porque ele já está revogado
  • Não trafegue tokens em logs nem em URLs (só em headers)

Toda resposta de erro segue o schema ErrorResponse. Mostre ao usuário o message; para reconhecer o erro no seu código, use error.key, que não muda com o idioma nem com o texto. error.code está sempre presente; error.field aponta o campo que causou o erro (para exibir a mensagem embaixo dele); error.internal descreve a regra para o suporte. Exemplo real:

{
  "success": false,
  "message": "E-mail ou senha incorretos.",
  "error": {
    "type": "INVALID_CREDENTIALS",
    "code": "INVALID_CREDENTIALS",
    "message": "E-mail ou senha incorretos.",
    "key": "gateway.auth.invalid_credentials",
    "params": {},
    "field": null,
    "internal": "Login recusado: e-mail ou senha não conferem. Responde 401."
  }
}

Os endpoints de autenticação respondem antes (ou durante a troca) da sessão. Por isso o message sai sempre em português: traduza na sua interface pela error.key.

HTTPerror.keyQuando
400gateway.auth.credentials_requiredLogin sem e-mail ou sem senha
401gateway.auth.invalid_credentialsE-mail ou senha incorretos
403gateway.auth.organization_deniedO usuário não pertence à organização pedida (login ou troca)
403gateway.auth.account_blockedConta sem permissão para entrar
400gateway.auth.organization_requiredTroca de organização sem organization_id
401gateway.auth.session_expiredrefresh_token inválido ou expirado; token recusado na troca de organização ou na saída
401gateway.auth.token_missingSem o cabeçalho Authorization, ou /refresh sem refresh_token (field: refresh_token)
400gateway.auth.logout_scope_invalidscope diferente de global ou local
500gateway.auth.session_create_failedFalha interna ao iniciar a sessão. Tente de novo em instantes
500gateway.auth.logout_failedFalha inesperada ao gravar o encerramento da sessão

Do ponto de vista do cliente, todo 401 significa "sessão inválida": renove pelo /refresh ou refaça o login.

Verificar uma permissão

Para saber se o usuário logado tem uma permissão (por exemplo, para mostrar ou esconder uma ação na tela), use o POST /data, operação call:

{ "mode": "structured", "operation": "call", "function": "fc_core_authorize", "args": { "p_permission": "filtro.compartilhar" } }
{ "success": true, "message": "Operacao concluida", "data": true }
ParâmetroTipoObrigatórioDescrição
p_permissiontextosimNome da permissão, no formato <recurso>.<operação> (ex.: filtro.compartilhar)
  • O usuário e a organização são sempre os do token: não há parâmetro de usuário nem de organização (qualquer outro parâmetro retorna 400).
  • data é true quando o usuário tem a permissão e false quando não tem.
  • Permissão que a organização ainda não exige responde true.
  • Permissão inexistente ou inativa responde false.
  • A resposta serve para a tela. A regra continua sendo aplicada no servidor quando a operação é executada.
SituaçãoHTTPerror.key
Respondeu200- (data = true ou false)
Sem token401gateway.auth.token_missing
p_permission ausente400gateway.data.call.arg_required
Parâmetro a mais (ex.: p_user_id)400gateway.data.call.args_unknown