60649fbf50f36076f38e15e5d2a4776b7ff9415f
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)
Produção
Base URL: https://sistema-distribuido-trabalho-faculd.vercel.app
Documentação interativa (Swagger): /docs
Setup local
- 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/123456
Estrutura da tabela User
A tabela User possui apenas:
idemailpasswordHashcreatedAtupdatedAt
Endpoints
| Método | Caminho | Auth | Descrição |
|---|---|---|---|
| POST | /api/auth/register |
Não | Cria novo usuário |
| POST | /api/auth/login |
Não | Autentica e retorna tokens |
| POST | /api/auth/refresh |
Não | Rotaciona refresh token |
| POST | /api/auth/forgot-password |
Não | Solicita reset de senha |
| POST | /api/auth/reset-password |
Não | Aplica nova senha com token |
| GET | /profile/me |
Sim (Bearer) | Retorna usuário autenticado |
| GET | /dashboard |
Sim (Bearer) | Orquestração A→B |
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 https://sistema-distribuido-trabalho-faculd.vercel.app/api/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 https://sistema-distribuido-trabalho-faculd.vercel.app/api/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 https://sistema-distribuido-trabalho-faculd.vercel.app/api/auth/forgot-password \
-H 'Content-Type: application/json' \
-d '{"email":"novo.usuario@example.com"}'
Observação: neste MVP a resposta já traz recovery.reset_token e recovery.reset_url.
4) Reset password
curl -X POST https://sistema-distribuido-trabalho-faculd.vercel.app/api/auth/reset-password \
-H 'Content-Type: application/json' \
-d '{"token":"<reset_token>","new_password":"novaSenha123"}'
5) Login com nova senha
curl -X POST https://sistema-distribuido-trabalho-faculd.vercel.app/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"novo.usuario@example.com","password":"novaSenha123"}'
6) Rota protegida
curl https://sistema-distribuido-trabalho-faculd.vercel.app/profile/me \
-H "Authorization: Bearer <access_token>"
7) Chamada entre serviços (A -> B)
curl https://sistema-distribuido-trabalho-faculd.vercel.app/dashboard \
-H "Authorization: Bearer <access_token>"
8) Refresh
curl -X POST https://sistema-distribuido-trabalho-faculd.vercel.app/api/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%