Autenticacao JWT

Fluxo JWT completo com login, registro, guards e bcrypt.

Fluxo de autenticacao

O fluxo JWT segue o padrao industry-standard:

  1. Usuario envia POST /api/auth/register com email, password e name
  2. O password e hasheado com bcrypt (10 salt rounds) e salvo no banco
  3. Um JWT e gerado com payload { sub: userId, email }
  4. O token e retornado como { access_token: "eyJ..." }
  5. O cliente envia o token no header Authorization: Bearer <token>
  6. O guard/middleware valida o token e injeta req.user

Arquivos gerados

Dependendo do backend escolhido, diferentes arquivos sao gerados em apps/api/src/auth/:

NestJS

auth/
├── auth.module.ts         # Configura JwtModule + PassportModule
├── auth.service.ts        # hashPassword, comparePassword, generateToken
├── auth.controller.ts     # POST /login, POST /register
├── jwt.strategy.ts        # PassportStrategy para validar tokens
└── jwt-auth.guard.ts      # Guard @UseGuards(JwtAuthGuard)

Express

auth/
├── jwt.ts                 # generateToken, verifyToken (jsonwebtoken)
├── hash.ts                # hashPassword, comparePassword (bcryptjs)
├── auth.middleware.ts     # Middleware de verificacao Bearer token
└── auth.routes.ts         # Router com /login e /register

Fastify

auth/
├── jwt.ts                 # generateToken, verifyToken
├── hash.ts                # hashPassword, comparePassword
├── auth.hook.ts           # preHandler hook para verificar token
└── auth.routes.ts         # Plugin de rotas com /login e /register

Protegendo rotas

Apos a autenticacao, voce pode proteger rotas usando o guard/middleware gerado:

NestJS

import { Controller, Get, UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from './auth/jwt-auth.guard';

@Controller('users')
export class UsersController {
  @Get('me')
  @UseGuards(JwtAuthGuard)
  getMe(@Req() req) {
    return req.user; // { id, email }
  }
}

Express

import { authMiddleware } from './auth/auth.middleware.js';

router.get('/me', authMiddleware, (req, res) => {
  res.json(req.user); // { sub, email }
});

Fastify

import { authHook } from './auth/auth.hook.js';

app.get('/me', { preHandler: authHook }, async (request) => {
  return request.user; // { sub, email }
});

Variaveis de ambiente

# Obrigatorias
JWT_SECRET=change-me-in-production-use-a-strong-secret
JWT_EXPIRES_IN=7d

Importante: Em producao, use um secret forte e aleatorio (ex: openssl rand -base64 64).