Files
nuxt-frontend/README.md

172 lines
3.4 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)
## Setup
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` / `student123`
- `admin@example.com` / `admin123`
- `limited@example.com` / `limited123`
## Estrutura da tabela `User`
A tabela `User` possui apenas:
- `id`
- `email`
- `passwordHash`
- `createdAt`
- `updatedAt`
## Endpoints
- `POST /auth/login`
- `POST /auth/refresh`
- `POST /auth/register`
- `POST /auth/forgot-password`
- `POST /auth/reset-password`
- `GET /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:
- `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 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
```bash
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)
```bash
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
```bash
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
```bash
curl -X POST http://localhost:3000/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"novo.usuario@example.com","password":"novaSenha123"}'
```
### 6) Rota protegida
```bash
curl http://localhost:3000/profile/me \
-H "Authorization: Bearer <access_token>"
```
### 7) Chamada entre serviços (A -> B)
```bash
curl http://localhost:3000/dashboard \
-H "Authorization: Bearer <access_token>"
```
### 8) Refresh
```bash
curl -X POST http://localhost:3000/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`