178 lines
4.2 KiB
Markdown
178 lines
4.2 KiB
Markdown
# 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":"<reset_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 <access_token>"
|
|
```
|
|
|
|
### 7) Chamada entre serviços (A -> B)
|
|
|
|
```bash
|
|
curl https://sistema-distribuido-trabalho-faculd.vercel.app/dashboard \
|
|
-H "Authorization: Bearer <access_token>"
|
|
```
|
|
|
|
### 8) Refresh
|
|
|
|
```bash
|
|
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:generate`
|
|
- `npm run prisma:migrate:dev`
|
|
- `npm run prisma:seed`
|
|
- `npm run jwt:keys`
|