# 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`, `refresh` e recuperação de senha - JWT assinado em `RS256` com contrato fixo - Middleware de validação JWT local - Serviço consumidor de referência (`/profile/me`) - Fluxo A -> B (`/dashboard` chama `/profile/me` com 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`](https://sistema-distribuido-trabalho-faculd.vercel.app/docs) ## Setup local 1. Instale dependências: ```bash npm install ``` 2. Gere chaves RSA para JWT: ```bash npm run jwt:keys ``` Distribua o valor de `JWT_PUBLIC_KEY_PEM` para todos os serviços consumidores. 3. Crie `.env` a partir de `.env.example` e preencha os valores. Se usar Postgres remoto com pool/proxy (ex.: Railway), use `DIRECT_DATABASE_URL` com conexão direta para migrations. 4. Execute migrações do Prisma: ```bash npm run prisma:migrate:dev -- --name init ``` 5. Rode seed para usuários de teste: ```bash npm run prisma:seed ``` 6. Inicie a aplicação: ```bash npm run dev ``` ## Usuários de seed - `student@example.com` / `123456` ## Estrutura da tabela `User` A tabela `User` possui apenas: - `id` - `email` - `passwordHash` - `createdAt` - `updatedAt` ## 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: - `sub` - `iss` - `aud` - `iat` - `exp` A identidade confiável do usuário é sempre o `sub`. ## Teste rápido (curl) ### 1) Cadastro ```bash 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 ```bash 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) ```bash 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 ```bash curl -X POST https://sistema-distribuido-trabalho-faculd.vercel.app/api/auth/reset-password \ -H 'Content-Type: application/json' \ -d '{"token":"","new_password":"novaSenha123"}' ``` ### 5) Login com nova senha ```bash 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 ```bash curl https://sistema-distribuido-trabalho-faculd.vercel.app/profile/me \ -H "Authorization: Bearer " ``` ### 7) Chamada entre serviços (A -> B) ```bash curl https://sistema-distribuido-trabalho-faculd.vercel.app/dashboard \ -H "Authorization: Bearer " ``` ### 8) Refresh ```bash curl -X POST https://sistema-distribuido-trabalho-faculd.vercel.app/api/auth/refresh \ -H 'Content-Type: application/json' \ -d '{"refresh_token":""}' ``` ## Scripts úteis - `npm run prisma:generate` - `npm run prisma:migrate:dev` - `npm run prisma:seed` - `npm run jwt:keys`