Autorização e Autenticação em TypeScript: da Teoria à Prática
No desenvolvimento web moderno, a segurança das aplicações é a pedra angular. TypeScript, como uma extensão estritamente tipada sobre JavaScript, fornece ferramentas poderosas para construir sistemas robustos de autenticação (verificação da identidade do usuário) e autorização (verificação de permissões de acesso). Neste artigo, abordaremos os conceitos-chave, bibliotecas populares e escreveremos um exemplo funcional em TypeScript.
Conceitos Básicos: Autenticação vs Autorização
Frequentemente, esses termos são confundidos. Vamos diferenciá-los claramente:
- Autenticação (Authentication) — processo de verificar quem você é. Por exemplo, login com nome de usuário e senha ou através de um serviço terceiro (Google, GitHub).
- Autorização (Authorization) — processo de verificar o que você pode fazer. Por exemplo, acesso ao painel de administração ou a capacidade de excluir posts.
Em TypeScript, esses processos são implementados através de middleware (manipuladores intermediários), que verificam tokens ou sessões antes de executar a requisição.
Bibliotecas Populares para TypeScript
Para implementar autorização e autenticação em projetos TypeScript, as mais utilizadas são:
jsonwebtoken— trabalho com JWT (JSON Web Tokens).bcrypt— hash de senhas.passport(com tipos@types/passport) — middleware flexível para Express.express-session— gerenciamento de sessões no servidor.crypto— módulo nativo do Node.js para trabalhar com hashes.
Exemplo Prático: Autenticação JWT em TypeScript
Vamos criar uma API REST simples com autenticação via JWT. O exemplo será em Express + TypeScript.
Passo 1. Instalação das Dependências
npm install express jsonwebtoken bcrypt dotenvnpm install -D typescript @types/express @types/jsonwebtoken @types/bcrypt ts-node nodemonPasso 2. Configuração do TypeScript (tsconfig.json)
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true }}Passo 3. Criação do Middleware para Autenticação
// src/middleware/auth.tsimport { Request, Response, NextFunction } from 'express';import jwt from 'jsonwebtoken';
interface UserPayload { id: string; email: string;}
// Estendemos a interface Request para armazenar dados do usuáriodeclare global { namespace Express { interface Request { user?: UserPayload; } }}
export const authenticate = ( req: Request, res: Response, next: NextFunction): void => { const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) { res.status(401).json({ message: 'Token não fornecido' }); return; }
const token = authHeader.split(' ')[1];
try { const decoded = jwt.verify( token, process.env.JWT_SECRET || 'default_secret' ) as UserPayload; req.user = decoded; next(); } catch (error) { res.status(401).json({ message: 'Token inválido' }); }};Passo 4. Middleware para Autorização por Papéis
// src/middleware/authorize.tsimport { Request, Response, NextFunction } from 'express';
export const authorize = (...allowedRoles: string[]) => { return (req: Request, res: Response, next: NextFunction): void => { // Assumimos que o papel está armazenado em req.user após a autenticação const userRole = (req as any).user?.role || 'user';
if (!allowedRoles.includes(userRole)) { res.status(403).json({ message: 'Acesso negado' }); Também na biblioteca
Charts para Swift: guia completo com exemplos
ORM para Java: comparação de Hibernate, MyBatis e JPA com exemplos
csv para Rust: guia completo com exemplos práticos
Envio de email em JavaScript (Node.js): Nodemailer, SendGrid, Mailgun
Framework CLI para Rust: Clap — ferramenta poderosa e conveniente para criar aplicações de console