36a1875ee6de4b53ac485ce5ec6310997554e783
Sistema Auth Central (Nuxt + Prisma)
MVP de autenticação central para serviços distribuídos.
O que este projeto entrega
- Auth Service com
register,login,refreshe recuperação de senha - JWT assinado em
RS256com contrato fixo - Middleware de validação JWT local
- Serviço consumidor de referência (
/profile/me) - Fluxo A -> B (
/dashboardchama/profile/mecom o mesmo Bearer token)
Stack
- Nuxt 4 (Nitro server routes)
- Prisma + Postgres
- JOSE (JWT)
Setup
- Instale dependências:
npm install
- Gere chaves RSA para JWT:
npm run jwt:keys
Distribua o valor de JWT_PUBLIC_KEY_PEM para todos os serviços consumidores.
-
Crie
.enva partir de.env.examplee preencha os valores. Se usar Postgres remoto com pool/proxy (ex.: Railway), useDIRECT_DATABASE_URLcom conexão direta para migrations. -
Execute migrações do Prisma:
npm run prisma:migrate:dev -- --name init
- Rode seed para usuários de teste:
npm run prisma:seed
- Inicie a aplicação:
npm run dev
Usuários de seed
student@example.com/123456s
Estrutura da tabela User
A tabela User possui apenas:
idemailpasswordHashcreatedAtupdatedAt
Endpoints
POST /auth/loginPOST /auth/refreshPOST /auth/registerPOST /auth/forgot-passwordPOST /auth/reset-passwordGET /profile/me(protegida)GET /dashboard(protegida, chama/profile/me)
Guia para serviços consumidores
docs/GUIA_VALIDACAO_JWT_SERVICOS_CONSUMIDORES.md
Contrato do Access Token
Claims obrigatórias:
subissaudiatexp
A identidade confiável do usuário é sempre o sub.
Teste rápido (curl)
1) Cadastro
curl -X POST http://localhost:3000/auth/register \
-H 'Content-Type: application/json' \
-d '{"email":"novo.usuario@example.com","password":"senha123"}'
Fluxo recomendado no cliente: register -> login.
2) Login
curl -X POST http://localhost:3000/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"novo.usuario@example.com","password":"senha123"}'
3) Forgot password (sem SMTP, modo didático)
curl -X POST http://localhost:3000/auth/forgot-password \
-H 'Content-Type: application/json' \
-d '{"email":"novo.usuario@example.com"}'
Observação: neste MVP didático a resposta já traz recovery.reset_token e recovery.reset_url.
4) Reset password
curl -X POST http://localhost:3000/auth/reset-password \
-H 'Content-Type: application/json' \
-d '{"token":"<reset_token>","new_password":"novaSenha123"}'
5) Login com nova senha
curl -X POST http://localhost:3000/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"novo.usuario@example.com","password":"novaSenha123"}'
6) Rota protegida
curl http://localhost:3000/profile/me \
-H "Authorization: Bearer <access_token>"
7) Chamada entre serviços (A -> B)
curl http://localhost:3000/dashboard \
-H "Authorization: Bearer <access_token>"
8) Refresh
curl -X POST http://localhost:3000/auth/refresh \
-H 'Content-Type: application/json' \
-d '{"refresh_token":"<refresh_token>"}'
Scripts úteis
npm run prisma:generatenpm run prisma:migrate:devnpm run prisma:seednpm run jwt:keys
Description
Languages
Vue
85.5%
TypeScript
13.9%
JavaScript
0.6%