auth.admin
Administrar usuários, papéis, grants e aplicações OAuth.
Só no client de servidor, e todo método aqui age como a plataforma — não como uma pessoa autenticada. Isso significa que nenhuma permissão é verificada em quem chama e nada registra quem pediu. Logue isso do seu lado; a trilha de auditoria não consegue recuperar para você.
A linha a ter em mente: o auth.grants é um usuário
fazendo algo, o auth.admin.grants é o seu back office fazendo algo. Recorrer ao
admin porque é mais fácil remove justamente a verificação que você queria.
Quatro namespaces ficam sob auth.admin:
admin.usersAdminUsersClientOptionalCriar, listar, atualizar, banir — e os caminhos de suporte para sessões e fatores.
admin.rolesAdminRolesClientOptionalDefinir papéis e os escopos que eles carregam.
admin.grantsAdminGrantsClientOptionalAtribuir acesso diretamente, sem convite.
admin.oauthClientsAdminOAuthClientsClientOptionalRegistrar aplicações autorizadas a pedir tokens ao seu issuer.
admin.users
create · list · get · update · delete · ban · unban
await nulvless.auth.admin.users.create(params);
await nulvless.auth.admin.users.list({ page, page_size });
await nulvless.auth.admin.users.get(userId);
await nulvless.auth.admin.users.update(userId, params);
await nulvless.auth.admin.users.delete(userId);create
emailstringOptionalphonePhoneOptionalusernamestringOptionalpasswordstringOptionalOmita para criar um usuário que ainda não tem como entrar — útil quando você o convida para definir uma.
profileUserProfileOptionalmetadataRecord<string, string | number>Optionalemail_verifiedbooleanOptionalCria o usuário com o e-mail já verificado.
phone_verifiedbooleanOptionalCria o usuário com o telefone já verificado. Exige um plano com autenticação por telefone.
Diferente do auth.signUp, nada é estritamente
obrigatório aqui, porque um admin pode estar semeando um registro antes da
pessoa. Um usuário sem identidade não consegue entrar, então passe pelo menos um
entre email, phone ou username, a menos que esse seja o objetivo.
Quando todas as credenciais enviadas estão marcadas como verificadas (email
com email_verified, phone com phone_verified), o usuário é criado
confirmado: nenhuma confirmação é enviada, nenhuma sessão é criada e ele já pode
entrar. Caso contrário, o usuário passa pela confirmação definida nas
configurações de cadastro da plataforma, como um link enviado para o e-mail.
list
pagenumberOptionalpage_sizenumberOptionalsortPaginationSortOptionalemailstringOptionalusernamestringOptionalphonestringOptionalidstringOptionalis_confirmedbooleanOptionalis_bannedbooleanOptionalDevolve Paginated<User>.
update
Recebe o userId, e então um conjunto mais estreito que o do create:
usernamestringOptionalprofileUserProfileOptionalmetadataRecord<string, string | number | null>OptionalMescla no que está guardado, então você só manda as chaves que está mudando.
Mande uma chave como null para removê-la. Omita o campo para não mexer em nada.
Identidades estão deliberadamente ausentes. Um e-mail ou telefone é trocado pelo
fluxo confirmado próprio dele em auth.users, nunca
editado no lugar por um admin — caso contrário um administrador poderia apontar
uma conta para um endereço que ninguém provou ser seu.
Os mesmos campos são editáveis pela própria pessoa através do
auth.users.update. Recorra ao caminho de admin só
quando estiver agindo sobre outra pessoa.
Cortando acesso
await nulvless.auth.admin.users.ban(userId);
await nulvless.auth.admin.users.unban(userId);Banir impede a entrada e deixa todo o resto intacto, então o histórico ligado à conta ainda resolve. Excluir é para quando o registro em si precisa sumir — lembre que os grants dela não desaparecem junto, então limpe também.
Sessões e fatores
await nulvless.auth.admin.users.getSessions(userId);
await nulvless.auth.admin.users.revokeSession(userId, sessionId);
await nulvless.auth.admin.users.signOutAll(userId);
await nulvless.auth.admin.users.getFactors(userId);
await nulvless.auth.admin.users.removeFactor(userId, factorId);O signOutAll é o que você chama depois de um comprometimento — ele encerra
todas as sessões da pessoa, em todo lugar.
O removeFactor é o caminho de suporte para quem perdeu o autenticador e os
códigos de recuperação. Ele tira um controle de segurança sem nenhuma
confirmação da pessoa, então precisa ficar atrás da verificação que o seu
processo de suporte exigir. A plataforma não vai questionar uma chave de admin.
admin.roles
list · create · update · delete
Um papel é um conjunto nomeado de escopos dentro de um contexto. Mudar os escopos de um papel muda o que todo mundo que o tem pode fazer, sem tocar em um único grant — que é por isso que é nele, e não no grant, que mudanças de permissão devem morar.
create
const { data: role } = await nulvless.auth.admin.roles.create({
name: 'Administrator',
key: 'admin',
context: 'org',
scopes: ['members:read', 'members:write', 'projects:read'],
});namestringRequiredLegível por pessoas. O que uma tela de membros mostra.
keystringRequiredO identificador estável, e o que o verify({ roles }) casa. Não o nome.
contextstringRequiredA qual tipo de recurso este papel se aplica. Fixo depois de criado.
scopesstring[]RequiredO que o papel concede.
descriptionstringOptionallist
list(context) → Role[]
const { data: roles } = await nulvless.auth.admin.roles.list('org');Os papéis definidos para um contexto. É daqui que vêm os valores de role_id
para o grants.invite — leia uma vez na
inicialização e mapeie, em vez de consultar a cada convite.
update
Recebe o role_id, e então name, description ou scopes. key e context
são fixos, porque mudar qualquer um reinterpretaria silenciosamente todo grant
existente.
admin.grants
list · set · delete · deleteByResource
set
Atribui acesso diretamente — sem convite, sem passo de aceite. O grant existe
imediatamente com status: 'granted'.
await nulvless.auth.admin.grants.set({
resource: org.slug,
granted_to_user_id: creatorId,
role_id: ownerRoleId,
});resourcestringRequiredgranted_to_user_idstringRequiredO usuário já precisa existir. Diferente do invite, este não consegue
endereçar alguém por e-mail.
role_idstringOptionalOmita para conceder escopos avulsos sem papel — útil para uma conta de serviço que nenhum papel deveria descrever.
scopesstring[]OptionalO uso canônico é semear o primeiro dono. Quem criou um recurso não deveria ter que aceitar um convite para ele, e fazer isso na mesma transação que cria o recurso significa que uma falha não deixa um órfão que ninguém consegue administrar.
list
pagenumberOptionalpage_sizenumberOptionalsortPaginationSortOptionalresourcestringOptionalcontextstringOptionalgranted_to_user_idstringOptionalrole_idstringOptionalDevolve Paginated<Grant>. Filtrar por granted_to_user_id responde "o que esta
pessoa alcança?" — a pergunta de back office que o auth.grants.list responde
apenas para quem chamou.
deleteByResource
await nulvless.auth.admin.grants.deleteByResource(org.slug);Limpa todo grant de um recurso de uma vez. Chame quando um projeto ou organização for excluído.
Pular isso deixa grants apontando para o nada. Inofensivo até um slug ser reaproveitado — momento em que os membros antigos reaparecem em silêncio no recurso novo.
admin.oauthClients
create · list · get · update · delete · regenerateSecret
await nulvless.auth.admin.oauthClients.create(params);
await nulvless.auth.admin.oauthClients.list();
await nulvless.auth.admin.oauthClients.get(id);
await nulvless.auth.admin.oauthClients.update(id, params);
await nulvless.auth.admin.oauthClients.delete(id);
await nulvless.auth.admin.oauthClients.regenerateSecret(id);Estas são as aplicações autorizadas a pedir tokens ao seu issuer — o outro lado
do auth.oauth.
O regenerateSecret rotaciona um client secret e o antigo para de funcionar
imediatamente. Não há janela de sobreposição, então combine com quem opera
aquela integração em vez de tratar como higiene de rotina.