Fundamentos
Os objetos que compõem o nulvless, e como eles se relacionam.
Tudo no nulvless parte de um conjunto pequeno de objetos. Com eles claros, o resto da documentação é mais detalhe do que conceito.
Organização, projeto, ambiente
Uma organização é dona da cobrança e dos membros. Um projeto é um produto, e vive dentro de uma organização. Um ambiente é uma cópia completa desse projeto — com usuários, sessões, provedores, templates e chaves próprios.
Ambientes não são uma flag numa linha. develop e main são bancos separados
que nunca compartilham dados, e cada um responde na sua própria URL de issuer —
main fica com o slug puro do projeto, e todo outro ambiente recebe o slug dele
como sufixo. Mover configuração entre eles é uma promoção deliberada e
registrada.
organização
└── projeto
├── ambiente · main → acme.nulvless.co
├── ambiente · staging → acme-staging.nulvless.co
└── ambiente · develop → acme-develop.nulvless.coÉ por isso que um usuário de teste nunca aparece em produção: ele nunca esteve naquele banco. Como a configuração anda para frente está em Ambientes.
Usuários e identidades
Um usuário é uma pessoa dentro de um ambiente. Uma identidade é uma forma dessa pessoa provar quem é — uma senha, uma conta Google, uma conta GitHub.
Um usuário pode ter várias identidades. Quem se cadastrou com senha e depois continuou com o Google segue sendo um usuário só, com um id só e um histórico só.
Sessões
Uma sessão é um período autenticado de um usuário em um dispositivo. Ela registra o dispositivo, a localização e os métodos usados para chegar até ela.
Sessões são revogáveis uma a uma, e carregam se o modo sudo está ativo.
Papéis, escopos, grants e contextos
A autorização é baseada em papéis, com duas peças que a fazem funcionar em produtos multi-tenant.
- Um escopo é a menor unidade — uma coisa que pode ser feita, como
projects:write. - Um papel é um conjunto nomeado de escopos, como
admin. - Um contexto é onde o papel se aplica: uma organização, um projeto, ou qualquer recurso seu.
- Um grant é um usuário com um papel dentro de um contexto.
Como o grant carrega o contexto, a mesma pessoa pode ser owner numa
organização e viewer em outra, sem o seu código tratar caso especial.
const { data } = await nulvless.auth.verify({
resource: 'proj_16tbwq34',
roles: ['owner', 'admin'],
});Chaves
Cada ambiente tem as suas chaves.
- Uma chave publicável (
pk-…) é segura no navegador. Ela só faz o que o usuário autenticado já poderia fazer. - Uma chave secreta (
sk-…) é só de servidor. Ela alcança as partes administrativas da API e nunca deve aparecer em código de cliente.
Qual chave você tem decide qual client você cria — veja Clients.
Tokens
O login devolve um access token e um refresh token. O access token é um JWT que seus serviços leem direto: ele carrega o usuário, os papéis e escopos dele, e as claims customizadas que você configurou.
É esse o ponto de colocar claims no token — um serviço que já lê o token não precisa de uma segunda chamada para saber o que quem chamou pode fazer.
Resultados, não exceções
Todo método do SDK devolve um objeto de resultado em vez de lançar exceção:
const { data, error } = await nulvless.auth.signIn({ email, password });
if (error) {
// trate aqui — error.code, error.message, error.status_code
return;
}O caminho de erro é algo que você trata, não algo que você captura. Veja Error handling.