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
- Login (
/login): usuário enviaemail+password(+organization_idopcional se pertencer a múltiplas organizações) - A API retorna
access_token(validade 1 hora) erefresh_token - Cliente armazena os tokens com segurança no escopo da sessão
- Toda chamada subsequente envia
Authorization: Bearer <access_token> - Antes do
access_tokenexpirar, cliente chama/refreshpara obter um novo /logoutencerra a sessão. A revogação é imediata: os demais endpoints passam a responder401para aquele token. Sair é idempotente: chamar/logoutde novo com o mesmo token responde200comdata.already_ended: true/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
/refreshantes de receber401 - Trate
401de forma uniforme: qualquer401significa sessão inválida: limpe o estado local e redirecione para o login - Não tente reutilizar um
access_tokenapóslogout, 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
messagesai sempre em português: traduza na sua interface pelaerror.key.
| HTTP | error.key | Quando |
|---|---|---|
| 400 | gateway.auth.credentials_required | Login sem e-mail ou sem senha |
| 401 | gateway.auth.invalid_credentials | E-mail ou senha incorretos |
| 403 | gateway.auth.organization_denied | O usuário não pertence à organização pedida (login ou troca) |
| 403 | gateway.auth.account_blocked | Conta sem permissão para entrar |
| 400 | gateway.auth.organization_required | Troca de organização sem organization_id |
| 401 | gateway.auth.session_expired | refresh_token inválido ou expirado; token recusado na troca de organização ou na saída |
| 401 | gateway.auth.token_missing | Sem o cabeçalho Authorization, ou /refresh sem refresh_token (field: refresh_token) |
| 400 | gateway.auth.logout_scope_invalid | scope diferente de global ou local |
| 500 | gateway.auth.session_create_failed | Falha interna ao iniciar a sessão. Tente de novo em instantes |
| 500 | gateway.auth.logout_failed | Falha inesperada ao gravar o encerramento da sessão |
Do ponto de vista do cliente, todo
401significa "sessão inválida": renove pelo/refreshou 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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
p_permission | texto | sim | Nome 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étruequando o usuário tem a permissão efalsequando 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ção | HTTP | error.key |
|---|---|---|
| Respondeu | 200 | - (data = true ou false) |
| Sem token | 401 | gateway.auth.token_missing |
p_permission ausente | 400 | gateway.data.call.arg_required |
Parâmetro a mais (ex.: p_user_id) | 400 | gateway.data.call.args_unknown |