2026-04-14 19:44:21 -05:00
2026-05-28 16:02:24 -05:00
2026-04-14 19:44:21 -05:00
2026-04-14 19:44:21 -05:00
2026-04-14 19:44:21 -05:00
2026-05-02 21:21:29 -05:00

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

Setup local

  1. Instale dependências:
npm install
  1. Gere chaves RSA para JWT:
npm run jwt:keys

Distribua o valor de JWT_PUBLIC_KEY_PEM para todos os serviços consumidores.

  1. 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.

  2. Execute migrações do Prisma:

npm run prisma:migrate:dev -- --name init
  1. Rode seed para usuários de teste:
npm run prisma:seed
  1. Inicie a aplicação:
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

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:generate
  • npm run prisma:migrate:dev
  • npm run prisma:seed
  • npm run jwt:keys
Description
No description provided
Readme 1.3 MiB
Languages
Vue 85.5%
TypeScript 13.9%
JavaScript 0.6%