
🔐 Aprenda autenticação construindo-a corretamente. Uma implementação de referência extensível e em conformidade com os padrões para Cloudflare Workers com Hono, Turso, PBKDF2 e sessões de token duplo JWT.
Aprenda autenticação construindo-a corretamente.
Demonstração ao Vivo · Modelo de Ameaças · Fluxos de Autenticação · ADRs
Nota da demonstração: O endpoint de login é protegido por desafios adaptativos de prova-de-trabalho (PoW) — falhas repetidas retornam dificuldade crescente de PoW. A limitação de taxa com suporte a cache está implementada e testada, mas atualmente não está ativada na demonstração ao vivo; altere
createCacheClientemapp.tspara ativá-la.
Uma implementação de referência de autenticação construída do zero para Cloudflare Workers — hash de senha PBKDF2, sessões de token duplo JWT, comparação em tempo constante, expiração deslizante e um plugin de observabilidade removível — tudo integrado com Hono, Turso (com cache opcional Valkey/Redis) e TypeScript estrito.
Cada escolha de design remonta a um padrão: NIST SP 800-63B para credenciais, NIST SP 800-132 para derivação de chaves, OWASP ASVS para verificação e RFC 8725 para boas práticas de JWT.
Lançando um produto? Use o Better Auth — ele cobre OAuth, chaves de acesso, MFA, limitação de taxa e muito mais de fábrica, com um ecossistema ativo de plugins. Este repositório existe para ensinar como a autenticação funciona, não para substituir uma biblioteca de produção.
Este projeto intencionalmente omite funcionalidades que estão fora de seu escopo educacional. Se você está estendendo este código para produção (ou avaliando o que um sistema de autenticação de produção exige), as tabelas abaixo organizam as lacunas por prioridade.
Para a maioria dos projetos reais, use o Better Auth em vez de construir isso você mesmo.
| Funcionalidade | Por que é importante | Padrão / Referência |
|---|---|---|
| Verificação de senhas vazadas | Impede o uso de senhas conhecidas em vazamentos públicos | NIST SP 800-63B §5.1.1.2, API HIBP |
Todas essas são excelentes razões para recorrer ao Better Auth em vez disso.
.
├── apps/
│ └── cloudflare-workers/ # Exemplo de Worker + rotas Hono
├── packages/
│ ├── core/ # Serviços de autenticação, middleware, utilitários criptográficos
│ ├── infrastructure/ # Cliente de banco de dados + utilitários
│ ├── observability/ # Emissão de eventos, desafios adaptativos, API de operações (plugin removível)
│ ├── schemas/ # Esquemas Zod
│ └── types/ # Tipos TypeScript compartilhados
├── tools/
│ └── cli/ # plctl — TUI Go para a superfície /ops
└── docs/
├── adr/ # Registros de Decisão de Arquitetura
└── audits/ # Auditorias de segurança
git clone https://github.com/vhscom/private-landing.git
cd private-landing
bun install
bun run dev
Pronto — sem contas, sem chaves de API, sem arquivos .env. O servidor de desenvolvimento inicia com um banco de dados SQLite local e segredos gerados. Abra http://localhost:8788 para registrar uma conta e explorar os fluxos de autenticação.
Tem uma conta Turso? Coloque um arquivo
.dev.varsemapps/cloudflare-workers/(veja.dev.vars.example) ebun run devusará automaticamente o wrangler com seu banco de dados remoto. Usebun run dev:localpara forçar o servidor local independentemente.
Consulte CONTRIBUTING.md para instruções de teste e implantação.
Este repositório inclui um arquivo CLAUDE.md que fornece contexto para assistentes de IA. Ao usar Claude Code, Cursor ou ferramentas de desenvolvimento similares baseadas em IA:
CLAUDE.md para contexto do projetodocs/adr/ explicam as escolhas de designdocs/audits/ documentam a postura de segurançaA base de código foi projetada para ser legível por IA, com limites de módulo claros, tipos abrangentes e nomenclatura descritiva.
| Camada | O que faz |
|---|
| Armazenamento de senhas | PBKDF2-SHA384 com salts de 128 bits, digest de integridade, rastreamento de versão (password-service.ts) |
| Gerenciamento de sessões | Sessões no lado do servidor com rastreamento de dispositivo, expiração deslizante, limite de no máximo 3 por usuário; sessões com cache opcional via Valkey/Redis (session-service.ts, cached-session-service.ts) |
| Alteração de senha | Reverificação da senha atual, rehash completo do PBKDF2, revogação atômica de todas as sessões (account-service.ts, ADR-004) |
| Padrão de token duplo JWT | Token de acesso de 15 min + token de atualização de 7 dias, vinculado à sessão para revogação (token-service.ts) |
| Middleware de autenticação | Fluxo de atualização automática, fixação explícita de HS256, validação da declaração typ (require-auth.ts) |
| Cookies seguros | HttpOnly, Secure, SameSite=Strict, Path=/ (cookie.ts) |
| Cabeçalhos de segurança | HSTS, CSP, CORP/COEP/COOP, Permissions-Policy, remoção de impressão digital (security.ts) |
| Validação de entrada | Esquemas Zod com política de senha compatível com NIST (apenas comprimento, sem regras de complexidade) |
| Limitação de taxa | Limitação de janela fixa contra ataques de força bruta e preenchimento de credenciais: baseada em IP em rotas públicas de autenticação (ex.: login), baseada em usuário em ações protegidas; sem bloqueios permanentes (alinhado com NIST) (ADR-006) |
| Plugin de observabilidade | Eventos de segurança estruturados, desafios adaptativos de PoW, API /ops autenticada por agente — conecta-se via middleware, removível excluindo um pacote (ADR-008) |
| Ferramentas de CLI | TUI em Go (plctl) para consultar eventos, gerenciar sessões e provisionar credenciais de agente via superfície /ops (tools/cli/) |
| Testes de vetor de ataque | Adulteração de JWT, confusão de algoritmo, confusão de tipo, casos extremos de unicode, verificações de vazamento de informações |
| Funcionalidade | Por que é importante | Padrão / Referência |
|---|
| Proteção CSRF (se SameSite for relaxado) | Atualmente, SameSite=Strict previne CSRF; se alterado para Lax por UX, é necessário um token explícito | Folha de Dicas CSRF do OWASP |
| Rotação do token de atualização | Detecta roubo de token — se um token de atualização rotacionado for repetido, revogue toda a família de sessão | RFC 6819 §5.2.2.3 |
Declaração aud em JWTs | Impede que um token de um serviço seja aceito por outro que compartilhe o mesmo segredo | RFC 7519 §4.1.3, RFC 8725 §3.9 |
| Nonces CSP para scripts inline | O CSP atual usa 'unsafe-inline'; nonces eliminam vetores XSS de scripts inline | MDN CSP script-src |
| Funcionalidade | Por que é importante | Padrão / Referência |
|---|
| Autenticação multifator TOTP | Adiciona um segundo fator para contas de alto valor | RFC 6238, NIST SP 800-63B §5.1.4 |
| WebAuthn / chaves de acesso | Autenticação resistente a phishing usando autenticadores de plataforma | WebAuthn Level 2 |
| OAuth / login social | Reduz atrito, evita fadiga de senhas | RFC 6749 |
| Links mágicos / OTP | Opção sem senha para fluxos de baixo risco | NIST SP 800-63B §5.1.3 |
| Análise de sessão | Rastreamento de dispositivo, visibilidade de sessões concorrentes, detecção de anomalias | Folha de Dicas de Gerenciamento de Sessão do OWASP |
| Rotação de chave de assinatura | Permite rotação periódica de segredos sem invalidar todas as sessões | RFC 7517 (JWK) |
| Funcionalidade | Por que é importante | Padrão / Referência |
|---|
| DPoP / vínculo de token | Vincula tokens à conexão TLS do cliente, impedindo repetição por exfiltração | RFC 9449 (DPoP) |
| Multi-inquilino | Isola pools de usuários, segredos e políticas por inquilino | Específico da aplicação |
| Geo-cercamento / reputação de IP | Bloqueia logins de regiões inesperadas ou IPs conhecidos como maliciosos | OWASP ASVS v5.0 §6.3.5 |
| Autenticação adaptativa | Aumenta os requisitos de autenticação com base em sinais de risco (dispositivo, localização, comportamento) | NIST SP 800-63B §6 |
| Atualização de iteração PBKDF2 ou Argon2id | OWASP recomenda 210.000 iterações PBKDF2-SHA512 (Cloudflare limita a 100k); Argon2id é resistente a memória | Folha de Dicas de Armazenamento de Senhas do OWASP |