Skip to main content
O Firebase Authentication é a sua fonte da verdade. O UserKit precisa saber qual dos seus usuários está na página, e não vai aceitar a palavra da página — o seu servidor assina a afirmação.
O identity secret nunca entra no bundle. Nunca prefixe com NEXT_PUBLIC_, nunca renderize no HTML, nunca mande para o navegador para economizar uma ida e volta. Quem tem esse segredo emite sessão verificada para qualquer um dos seus usuários.
O contrato é o da página de identidade federada, e nada aqui o altera:

O que o Firebase fornece

Um valor: uid. O Firebase é o provedor que não chega como cookie que o seu servidor pode ler — o navegador guarda um ID token e o envia, e um token é uma string que qualquer um pode compor. É o verifyIdToken que transforma isso em fato.
lib/firebase.ts
O user.uid também está ali no navegador, e deliberadamente não é o que se envia. Um id que a página fornece é um id que a página escolheu — assiná-lo deixaria qualquer visitante ser qualquer pessoa.

A metade do servidor

app/api/userkit-boot/route.ts
Um ID token que não verifica responde 401, exatamente como um ausente. A diferença é um detalhe da sua verificação para o qual o navegador não tem uso.

A metade do cliente

getState().verified só é true quando o HMAC conferiu. Logado no Firebase com verified: false significa que o segredo é do outro ambiente ou que a mensagem assinada não era exatamente o external_id.

Session cookies também funcionam

createSessionCookie é a outra forma, e deixa este endpoint com a cara do exemplo do Supabase: leia o cookie, verifique com verifySessionCookie, assine o uid. Nada acima da linha do provedor muda.

Configuração

O que não viaja

Um ID token do Firebase carrega email e a claim email_verified. São afirmações sobre os registros do Firebase, e não viram identidade no UserKit: um e-mail enviado pelo /v1/boot é guardado como atributo, não resolve para um contato existente e não vira aresta de identidade. O HMAC prova o external_id e só ele. Para provar um endereço, mande um magic link ou um código por e-mail — os dois fluxos que chegam nele.

O exemplo completo

Um app Next executável com esses arquivos, um .env.example e as partes que esta página deixa de fora.