O que add-auth faz?
Copie os templates de autenticação testados neste plugin para o projeto do usuário e conecte-os. Não escreva autenticação do zero e não altere a lógica de segurança nos templates; adapte apenas as bordas (acesso ao banco de dados, importações, interface de usuário).
Os templates estão em <skill-dir>/../../templates/, onde <skill-dir> é o
diretório base desta skill:
templates/fastapi/auth/– Pacote FastAPI:config.py,security.py,models.py,db.py,deps.py,routes.py,email.py; testes emtemplates/fastapi/tests/test_auth.py.templates/node/lib/auth/core.ts– Núcleo independente de framework (hashing, tokens de acesso e redefinição, opções de cookie) comcore.test.ts.templates/nextjs/– Camada Next.js App Router sobre o núcleo:lib/auth/{schema,users,session,email}.ts,app/(auth)/actions.ts,proxy.ts.
1. Verifique antes de copiar
Descubra e informe ao usuário em uma ou duas linhas:
- Stack: FastAPI (procure por
fastapiem pyproject/requirements), Next.js (nextem package.json), ou outro servidor Node (Express, Hono, Fastify,httppuro). - Camada de banco de dados: SQLModel/SQLAlchemy, Drizzle, Prisma ou SQL puro, e onde a sessão ou o objeto
dbreside. - Autenticação existente: uma tabela
users, uma rota de login, uma biblioteca JWT, um provedor de autenticação (Clerk, Supabase, Auth.js). Se a autenticação já existir, pare e pergunte se deve substituí-la ou estendê-la. - Se o projeto já possui uma tabela
userscom dados. Nesse caso, mapeie as colunas do template para ela com uma migração, em vez de criar uma segunda tabela.
2. Copie e conecte
Copie com o script do plugin, não lendo e reescrevendo os arquivos: ele os copia exatamente e não custa tokens. É scripts/install.mjs dois níveis acima do diretório base desta skill (<skill-dir>/../../scripts/install.mjs).
Execute a partir da raiz do projeto com --dry-run primeiro, depois para valer:
node <skill-dir>/../../scripts/install.mjs fastapi app --tests tests # app/auth/*.py, tests/test_auth.py
node <skill-dir>/../../scripts/install.mjs nextjs . # ou src/ se o alias @/ apontar para lá
node <skill-dir>/../../scripts/install.mjs node src/auth # apenas o núcleo, para outros servidores Node
Ele se recusa a sobrescrever e não copia nada se algum arquivo de destino existir. Quando a colisão for um arquivo para mesclar (um proxy.ts ou middleware.ts existente), execute novamente com --keep-existing, que copia o restante, depois mescle manualmente. Use --force apenas quando o usuário concordar em perder o arquivo. Se node não estiver disponível, copie os mesmos arquivos manualmente (cp) e ainda assim não os redigite.
Após copiar, altere apenas o que as etapas abaixo nomeiam. Deixe a lógica em security.py, core.ts e as rotas intocadas.
FastAPI
- Copie com
install.mjs fastapi <package-dir> --tests <tests-dir>(por exemploapp/auth/). - Edite
auth/db.pypara queget_sessionseja a dependência de sessão existente no projeto. Esse é o único lugar onde a autenticação toca a configuração do banco de dados. - Se o projeto usar SQLAlchemy puro, não SQLModel, reescreva o modelo
Userdemodels.pycomo um modelo SQLAlchemy com as mesmas colunas e mantenha os esquemas Pydantic. app.include_router(auth_router)no arquivo principal do app.- Proteja rotas com
user: CurrentUseroudependencies=[Depends(require_role("admin"))]. - Adicione dependências:
pyjwt,pwdlib[argon2,bcrypt],email-validator,python-multipart,sqlmodel(se ainda não estiver presente). - Crie a tabela
usersatravés das migrações do projeto (Alembic autogenerate se tiver Alembic). - Corrija as importações no
test_auth.pycopiado para o caminho do pacote (from authvira, por exemplo,from app.auth) e execute-o.
Next.js (App Router)
- Copie com
install.mjs nextjs <app-root>: o núcleo com seu teste,lib/auth/*,app/(auth)/actions.tseproxy.ts. - Next.js 15 ou anterior: renomeie
proxy.tsparamiddleware.tse sua exportação paramiddleware. Se o projeto já tiver um arquivo middleware/proxy, mescle a verificação de autenticação nele. - Aponte
lib/auth/users.tspara o banco de dados do projeto: altere a importação dedb, ou reescreva suas cinco funções para Prisma/SQL puro. Mescleschema.tsno esquema Drizzle existente e gere uma migração. - Defina
PROTECTEDno proxy para os caminhos privados do app. - Construa as páginas
/sign-in,/sign-up,/forgot-passworde/reset-passwordusando os próprios componentes e estilos do projeto. Cada uma é um formulário que envia para a server action correspondente através deuseActionState; passenextcomo um campo oculto no login e o parâmetro de buscatokenna redefinição. - Em componentes e actions do servidor, use
getUser()ourequireUser("admin")delib/auth/session.ts. - Dependências:
jose,bcryptjs,zod,server-only(edrizzle-ormse estiver usando o arquivo Drizzle como está).
Outros servidores Node (Express, Hono, Fastify, http puro)
Copie apenas o núcleo com install.mjs node <dir>. Escreva as rotas no estilo do projeto,
mantendo o mesmo comportamento de templates/nextjs/app/(auth)/actions.ts:
register, login (mesmo erro para email desconhecido e senha errada; chame
verifyPassword mesmo quando o usuário não for encontrado), logout, me, alterar senha,
esqueci a senha (mesma resposta, existindo ou não a conta), redefinir senha
(readResetToken com o hash atual do usuário). Leia o token do
cookie session (definido com cookieOptions()) ou de um cabeçalho Authorization: Bearer.
Adicione um middleware requireUser/requireRole.
3. Ambiente
Adicione ao .env.example (nunca a um .env commitado):
AUTH_SECRET– pelo menos 32 caracteres aleatórios. Gere um para o.envlocal do usuário comnode -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"; nunca imprima no chat.AUTH_ACCESS_TOKEN_MINUTES(padrão 7 dias),AUTH_RESET_TOKEN_MINUTES(padrão 60).- FastAPI:
FRONTEND_URL, eSMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASSWORD,EMAIL_FROMpara emails de redefinição. Next.js:APP_URL, depois substitua o corpo delib/auth/email.tspelo provedor de email do projeto. Sem email configurado, os links de redefinição são registrados no log, o que é aceitável para desenvolvimento local.
4. Verifique se funciona
Execute os testes copiados e as próprias verificações do projeto (testes, type-check, lint, build).
Relate falhas com sua saída. Depois diga o que o usuário ainda precisa fazer manualmente, geralmente: definir AUTH_SECRET em produção, configurar email, executar a migração no banco de dados real.
Regras
- Manter: hashing Argon2/bcrypt, a verificação de hash dummy para emails desconhecidos, mesmas respostas para contas desconhecidas, tokens de redefinição vinculados ao hash da senha, verificações de
purposenos tokens, cookies httpOnly SameSite=Lax,safeNextem redirecionamentos. - Não colocar tokens em localStorage, não registrar senhas ou tokens, não ampliar CORS para rotas de autenticação.
- Limitação de taxa de login não está nos templates. Se o projeto tiver um limitador de taxa, coloque as rotas de login e esqueci a senha atrás dele; caso contrário, mencione isso.
- Sessões são tokens assinados, portanto, fazer logout encerra a sessão naquele navegador, mas um token copiado permanece válido até expirar. Se o usuário precisar de "deslogar de todos os lugares", adicione uma coluna
token_versione verifique-a no leitor de tokens.