Autenticacao JWT
Fluxo JWT completo com login, registro, guards e bcrypt.
Fluxo de autenticacao
O fluxo JWT segue o padrao industry-standard:
- Usuario envia
POST /api/auth/registercomemail,passwordename - O password e hasheado com bcrypt (10 salt rounds) e salvo no banco
- Um JWT e gerado com payload
{ sub: userId, email } - O token e retornado como
{ access_token: "eyJ..." } - O cliente envia o token no header
Authorization: Bearer <token> - 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).