Tokens JWT em JavaScript (Node.js)
\n\nJSON Web Token (JWT) é um padrão aberto (RFC 7519) para criar tokens de acesso baseados em JSON. O JWT é amplamente utilizado para autenticação e troca de informações entre cliente e servidor em aplicações web modernas em Node.js. Neste artigo, vamos explorar como trabalhar com JWT no ambiente Node.js usando a biblioteca popular jsonwebtoken.
O que é JWT?
\n\nO JWT consiste em três partes separadas por pontos:
\n\n- \n
- Header — cabeçalho contendo o tipo do token e o algoritmo de assinatura (por exemplo, HS256 ou RS256). \n
- Payload — carga útil onde são armazenados os dados (claims): ID do usuário, função, tempo de vida do token, etc. \n
- Signature — assinatura criada com base no header, payload e chave secreta. A assinatura garante que o token não foi alterado. \n
Visualmente, o JWT se parece com isto: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Instalação da biblioteca jsonwebtoken
\n\nPara trabalhar com JWT em Node.js, utiliza-se o pacote jsonwebtoken. Instale-o via npm:
npm install jsonwebtoken\n\nApós a instalação, você pode importar a biblioteca no seu projeto:
\n\nconst jwt = require('jsonwebtoken');\n\nGeração (assinatura) do token JWT
\n\nPara criar um token, use o método jwt.sign(). Ele aceita três parâmetros principais:
- \n
- payload — objeto com os dados a serem codificados no token. \n
- secretOrPrivateKey — chave secreta (ou chave privada para algoritmos RSA/ECDSA). \n
- options — objeto com opções, como
expiresInpara definir o tempo de vida do token. \n
Exemplo de geração de token:
\n\nconst jwt = require('jsonwebtoken');\n\nconst payload = {\n userId: 12345,\n role: 'user'\n};\n\nconst secretKey = 'your-secret-key-here';\n\nconst token = jwt.sign(payload, secretKey, { expiresIn: '1h' });\n\nconsole.log('JWT gerado:', token);\n\nNeste exemplo, o token será válido por 1 hora. Você também pode especificar o tempo em segundos (expiresIn: 3600) ou em outros formatos, como '7d' (7 dias) ou '30m' (30 minutos).
Verificação do token JWT
\n\nPara verificar a autenticidade do token, use o método jwt.verify(). Ele retorna o payload decodificado se o token for válido, ou lança um erro se o token expirou ou a assinatura estiver incorreta.
const jwt = require('jsonwebtoken');\n\nconst token = 'eyJhbGciOiJIUzI1NiIs...'; // seu token\nconst secretKey = 'your-secret-key-here';\n\ntry {\n const decoded = jwt.verify(token, secretKey);\n console.log('Dados decodificados:', decoded);\n} catch (err) {\n console.error('Erro de verificação:', err.message);\n}\n\nSe o token expirou, você receberá o erro 'jwt expired'. Se a assinatura estiver incorreta — 'invalid signature'.
Decodificação sem verificação de assinatura
\n\nÀs vezes, é necessário apenas ler os dados do token sem verificar a assinatura (por exemplo, para depuração). Para isso, use jwt.decode():
const jwt = require('jsonwebtoken');\n\nconst token = 'eyJhbGciOiJIUzI1NiIs...';\nconst decoded = jwt.decode(token);\n\nconsole.log('Payload sem verificação:', decoded);\n\nImportante: jwt.decode() não verifica a assinatura, portanto, não o utilize para autenticação em produção.
Middleware para Express com JWT
\n\nEm aplicações web com Express, o JWT é frequentemente usado para proteger rotas. Vamos criar um middleware simples que verifica o token do cabeçalho <