Files
nuxt-frontend/README.md

3.4 KiB

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:
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 s

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

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

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)

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

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

curl -X POST http://localhost:3000/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"novo.usuario@example.com","password":"novaSenha123"}'

6) Rota protegida

curl http://localhost:3000/profile/me \
  -H "Authorization: Bearer <access_token>"

7) Chamada entre serviços (A -> B)

curl http://localhost:3000/dashboard \
  -H "Authorization: Bearer <access_token>"

8) Refresh

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