Tokens JWT em TypeScript: guia completo
JSON Web Token (JWT) é um padrão aberto (RFC 7519) para criação de tokens de acesso baseados no formato JSON. JWT é amplamente utilizado para autenticação e troca de informações entre cliente e servidor. Neste artigo, vamos detalhar como trabalhar com tokens JWT em TypeScript, usando bibliotecas populares e melhores práticas.
O que é JWT?
JWT consiste em três partes separadas por pontos:
- Header (cabeçalho) — contém informações sobre o tipo de token e algoritmo de assinatura
- Payload (carga útil) — contém dados (claims), como ID do usuário, função, prazo de validade
- Signature (assinatura) — criada a partir do cabeçalho, payload e chave secreta
Um JWT típico se parece com isto:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cInstalação de bibliotecas para trabalhar com JWT em TypeScript
Para trabalhar com JWT em TypeScript, usaremos a biblioteca jsonwebtoken juntamente com os tipos @types/jsonwebtoken.
npm install jsonwebtokennpm install --save-dev @types/jsonwebtokenCriação de token JWT em TypeScript
Veja um exemplo de criação de token JWT com payload tipado:
import jwt from 'jsonwebtoken';
// Definimos a interface para o payloadinterface TokenPayload { userId: string; email: string; role: 'user' | 'admin';}
// Chave secreta (em projeto real, armazene em .env)const JWT_SECRET = 'your-super-secret-key';
// Criamos o tokenfunction generateToken(payload: TokenPayload): string { return jwt.sign(payload, JWT_SECRET, { expiresIn: '1h', // token válido por 1 hora issuer: 'pythonlib.ru', subject: payload.userId });}
// Exemplo de usoconst userPayload: TokenPayload = { userId: '12345', email: 'user@example.com', role: 'user'};
const token = generateToken(userPayload);console.log('Token gerado:', token);Verificação e decodificação de JWT
Para verificar a autenticidade do token e extrair os dados, use o seguinte código:
import jwt, { JwtPayload, VerifyErrors } from 'jsonwebtoken';
interface DecodedToken extends JwtPayload { userId: string; email: string; role: 'user' | 'admin';}
function verifyToken(token: string): DecodedToken | null { try { const decoded = jwt.verify(token, JWT_SECRET) as DecodedToken; return decoded; } catch (error) { if (error instanceof jwt.TokenExpiredError) { console.error('Token expirado'); } else if (error instanceof jwt.JsonWebTokenError) { console.error('Token inválido'); } else { console.error('Erro de verificação:', error); } return null; }}
// Verificamos o tokenconst decoded = verifyToken(token);if (decoded) { console.log('Dados do token:', decoded); console.log('Função do usuário:', decoded.role);}Middleware para Express.js com TypeScript
Integramos a verificação JWT em um middleware Express com tipagem completa:
import { Request, Response, NextFunction } from 'express';import jwt from 'jsonwebtoken';
// Estendemos a interface Request para armazenar dados do usuáriointerface AuthRequest extends Request { user?: { userId: string; email: string; role: 'user' | 'admin'; };}
function authMiddleware(req: AuthRequest, res: Response, next: NextFunction): void { const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) { res.status(401).json({ message: 'To Também na biblioteca
Programação Reativa em Java: Biblioteca Reactor
Apache HttpClient para Java: guia completo com exemplos
Testes em Kotlin: frameworks e ferramentas para código de qualidade
Cliente OAuth para C# (.NET): biblioteca IdentityModel e integração com OAuth 2.0