Skip to main content
Quatro famílias de credencial, quatro superfícies. Uma credencial de uma nunca abre as rotas de outra — isso é garantido pelo prefixo, antes de qualquer consulta ao banco. Detalhes completos em Credenciais.

Sessões de staff

Consiga uma no cadastro, no login, ou na troca de dois fatores:
Contas com dois fatores respondem isto no lugar, e nenhuma sessão é emitida ainda:
Ramifique em two_factor_required, depois troque o desafio em /v1/auth/two-factor dentro de 5 minutos. Veja Dois fatores. Depois envie em toda requisição:
Sessões vivem 30 dias e são revogáveis: sair, trocar a senha, redefinir a senha e perder o vínculo matam todas elas no servidor.

Chaves de API

Só no servidor. Criadas no painel, mostradas uma vez.
O ambiente da chave é resolvido a partir da linha armazenada em toda requisição. Chame /v1/me uma vez no start-up para confirmar qual você está segurando.

Chaves publicáveis

Não é header. Vai no corpo dos endpoints que a aceitam:
O portão não é o CORS — esses caminhos respondem a qualquer origem, deliberadamente. O portão é a lista de origens permitidas da chave. Vazia significa qualquer origem; preenchida significa só correspondências exatas, e um header Origin ausente é recusado.

Sessões de contato

Emitidas pelo boot, por um magic link resgatado, por login hosted, ou por verificação de e-mail. Leem aquele contato e mais nada.
O verified na sessão diz se a identidade por trás dela foi comprovada. Uma sessão não verificada é usável e fica marcada, mas é barrada de qualquer coisa por onde os dados de outra pessoa pudessem vazar.

Falhas

Credencial ausente, malformada, expirada ou revogada — e também “você não é membro daquela organização”, porque o JOIN do vínculo não casa com nada e distinguir os dois casos vazaria que a organização existe.
Autenticado, mas o seu papel não carrega a permissão. Diferente do 401: logar de novo não vai ajudar.
Também a resposta para um recurso em outra organização ou outro ambiente. O 404 nunca revela qual.

Levando a família errada

Uma credencial bem formada de outra família recebe isso, em vez de um “inválido” seco:
401
Um caso é erro de configuração, o outro é evento de segurança. Eles não deveriam ler igual nos seus logs.

Não revelar se uma conta existe

Vários endpoints respondem igual havendo ou não conta para aquele endereço. Isso é deliberado e vale preservar se você mexer nesses caminhos: Sem a equalização de tempo, só contas reais pagariam as dezenas de milissegundos do bcrypt, e a latência sozinha responderia a pergunta que o código de status se recusa a responder.