Tokens JWT em TypeScript: guia completo com a biblioteca jsonwebtoken
\n\nJSON 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. Em TypeScript, graças à tipagem estrita, trabalhar com JWT se torna especialmente conveniente e seguro. Neste artigo, veremos como usar a biblioteca popular jsonwebtoken em TypeScript para criar, verificar e gerenciar tokens JWT.
Instalação e configuração
\n\nPara começar, instale os pacotes necessários:
\n\nnpm install jsonwebtoken\nnpm install -D @types/jsonwebtoken\n\nO primeiro pacote é a própria biblioteca, o segundo são os tipos TypeScript para ela. Após a instalação, crie um arquivo jwt.service.ts onde armazenaremos toda a lógica de trabalho com tokens.
Criação de token JWT
\n\nA função principal do jsonwebtoken é sign(). Vejamos seu uso com tipagem:
import jwt from 'jsonwebtoken';\n\ninterface TokenPayload {\n userId: number;\n email: string;\n role: 'user' | 'admin';\n}\n\nconst createAccessToken = (payload: TokenPayload): string => {\n const secret = process.env.JWT_SECRET || 'default_secret';\n const options: jwt.SignOptions = {\n expiresIn: '15m', // token válido por 15 minutos\n algorithm: 'HS256',\n };\n\n return jwt.sign(payload, secret, options);\n};\n\nImportante: nunca armazene a chave secreta no código. Use variáveis de ambiente (arquivo .env).
Verificação e decodificação do token
\n\nPara verificar a autenticidade do token, use a função verify(). Ela verifica automaticamente a assinatura e a validade:
const verifyToken = (token: string): TokenPayload => {\n const secret = process.env.JWT_SECRET || 'default_secret';\n\n try {\n const decoded = jwt.verify(token, secret) as TokenPayload;\n return decoded;\n } catch (error) {\n if (error instanceof jwt.TokenExpiredError) {\n throw new Error('Token expirado');\n }\n if (error instanceof jwt.JsonWebTokenError) {\n throw new Error('Token inválido');\n }\n throw error;\n }\n};\n\nObserve a conversão de tipo as TokenPayload — isso garante que o TypeScript conheça a estrutura dos dados decodificados.
Refresh-tokens: extensão da sessão
\n\nNa prática, os access-tokens têm vida curta (15-30 minutos), por isso é necessário um mecanismo para renová-los. Para isso, usa-se um refresh-token com maior tempo de vida:
\n\nconst createRefreshToken = (payload: TokenPayload): string => {\n const secret = process.env.JWT_REFRESH_SECRET || 'refresh_secret';\n const options: jwt.SignOptions = {\n expiresIn: '7d', // uma semana\n algorithm: 'HS256',\n };\n\n return jwt.sign(payload, secret, options);\n};\n\nconst refreshAccessToken = (refreshToken: string): string => {\n const secret = process.env.JWT_REFRESH_SECRET || 'refresh_secret';\n\n try {\n const decoded = jwt.verify(refreshToken, secret) as TokenPayload;\n // Pode verificar se o refresh-token não foi revogado no banco de dados\n return createAccessToken({\n userId: decoded.userId,\n email: decoded.email,\n role: decoded.role,\n });\n } catch {\n throw new Error('Refresh-token inválido');\n }\n};\n\nMiddleware para Express em TypeScript
\n\nA integração do JWT com Express.js requer a criação de um middleware. Aqui está uma versão tipada:
\n\nimport { Request, Response, NextFunction } from 'express';\n\ninterface AuthRequest extends Request {\n user?: TokenPayload;\n}\n\nconst authMiddleware = (req: AuthRequest, res: Response, next: NextFunction) => {\n const authHeader = req.headers.authorization;\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n return res Também na biblioteca
Cliente OAuth para Kotlin: integração com provedores via ktor-client e kotlinx-serialization
AngleSharp para C# (.NET): guia completo com exemplos práticos
SwiftyUserDefaults para Swift: guia completo com exemplos
Validação de dados em Java: visão geral de ferramentas e bibliotecas
Trabalhando com Excel em Swift: Guia Completo de Bibliotecas e Ferramentas para iOS/macOS