Documentação
Servidor OAuthClientes

Clientes

Registrar aplicações de terceiros, lidar com segredos e redirect URIs, e quando permitir registro dinâmico.

Um cliente é uma aplicação autorizada a pedir acesso aos seus usuários. Registrar um produz um client_id, opcionalmente um client_secret, e a lista de redirect URIs para onde o fluxo pode voltar.

Público e confidencial

A divisão não é sobre confiança, é sobre conseguir guardar um segredo.

Confidencialtem client_secretOptional

Roda num servidor que o desenvolvedor controla. Manda client_secret na requisição de token. Um backend web, um daemon, uma CLI com componente servidor.

Públicosem segredoOptional

Roda onde o usuário consegue ler — SPA no navegador, app mobile, app desktop. Qualquer segredo enviado para lá está publicado. Autentica só com PKCE.

Uma single-page app é pública mesmo que o desenvolvedor insista que não. Qualquer coisa no bundle é legível por quem abrir o devtools.

Os dois tipos rodam o mesmo fluxo, e os dois precisam de PKCE. O segredo é um fator adicional para quem pode guardá-lo, não um substituto do verifier.

Redirect URIs

Registrados antes, casados exatamente.

Registrado:  https://acme.example.com/callback
Casa:        https://acme.example.com/callback
Rejeitado:   https://acme.example.com/callback/
Rejeitado:   https://acme.example.com/Callback
Rejeitado:   https://acme.example.com/callback?next=/home

Sem curinga, sem prefixo, sem substring. É mais estrito que provedores OAuth antigos e é a regra mais valiosa da especificação: casamento frouxo de redirect é como códigos de autorização acabam entregues à parte errada.

Valores dinâmicos que antes moravam no redirect URI vão no state, que volta intacto.

Registre um URI por ambiente que o cliente realmente usa — http://localhost:3000/callback para desenvolvimento é normal.

Registrando pelo Console

Servidor OAuth → Aplicações → Nova aplicação. Você informa:

NomeobrigatórioOptional

Exibido na tela de consentimento. Use o nome pelo qual os usuários conhecem o produto, não um codinome interno.

Redirect URIsobrigatórioOptional

Um ou mais, exatos.

Logo URIopcionalOptional

Renderizado na tela de consentimento. Ajuda a reconhecer um app familiar.

Client URIopcionalOptional

A página do app, para o usuário conferir quem está pedindo.

O segredo é mostrado uma vez, na criação. Não há como lê-lo depois — regenerar é a única saída, e invalida o antigo imediatamente.

Registrando por código

const { data, error } = await nulvless.auth.oauth.register({
  name: 'Acme Analytics',
  redirectUris: ['https://acme.example.com/callback'],
  logoUri: 'https://acme.example.com/logo.png',
  clientUri: 'https://acme.example.com',
});

Registro dinâmico

A RFC 7591 permite que uma aplicação se registre sozinha, sem ninguém no seu Console. Vem desligado, e vale dizer o trade-off com clareza.

Ligue quando você quiser um ecossistema aberto — qualquer um constrói sem pedir — ou quando estiver atendendo clientes MCP e ferramentas de agentes, onde quem registra é software.

Deixe desligado quando suas integrações são parcerias. Todo cliente que existe é um nome que pode aparecer numa tela de consentimento ao lado do seu produto, e um endpoint aberto significa que você não controla essa lista.

Registro aberto é porta aberta para a sua tela de consentimento

Quem pode registrar pode criar um app chamado "Segurança da Conta" com um logo convincente e mandar o link para os seus usuários. Nada é comprometido tecnicamente — o usuário ainda precisa aprovar — mas a tela de consentimento é superfície de confiança, e registro aberto significa que você deixou de curá-la. Se ligar isso, trate nome de cliente como conteúdo não confiável na sua tela.

Rotacionando um segredo

Aplicações → o app → Regenerar segredo. O antigo para de funcionar na hora: não há janela de sobreposição, então combine com quem opera o cliente antes.

Rotacione quando alguém com acesso sai, quando um segredo passou por log ou chamado de suporte, ou na cadência que seu programa de compliance definir.

O que o usuário pode revogar

Quem concedeu acesso pode retirar, e sua aplicação pode mostrar essa lista:

const { data: grants } = await nulvless.auth.oauth.list();
await nulvless.auth.oauth.revoke(clientId);

Vale construir nas configurações de conta. "Quais apps veem meus dados, e como eu corto um" é uma pergunta que as pessoas fazem depois de já terem concedido algo, e a resposta não deveria ser abrir um chamado.

Nesta página