Como implementar a autenticação JWT em Aplicações Web?
jwt
Veja abaixo um guia completo sobre implementação de autenticação JWT em Aplicações Web.
Guia Completo sobre Implementação de Autenticação JWT em Aplicações Web
A autenticação segura é um pilar fundamental no desenvolvimento de aplicações web modernas. Um dos métodos mais populares para realizar essa autenticação é através do JSON Web Token, mais conhecido como JWT. Neste guia, vamos explorar o que é JWT, como funciona, e como você pode implementá-lo em suas aplicações web, especialmente utilizando Node.js.
O que é JWT?
JWT, ou JSON Web Token, é um padrão aberto (RFC 7519) que define uma maneira compacta e segura de transmitir informações entre duas partes – como um cliente e um servidor – como um objeto JSON. O JWT é amplamente utilizado para autenticação, pois é eficiente e fácil de implementar em sistemas que utilizam APIs RESTful.
Estrutura do JWT
Um JWT é composto por três partes:
- Header (Cabeçalho)
- Payload (Corpo)
- Signature (Assinatura)
Essas três partes são codificadas em Base64 e separadas por pontos ('.'), formando um token que se parece com isto:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywiaWF0IjoxNjE2MjY5MDAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Vamos analisar cada parte em mais detalhes.
Header
O Header é a primeira parte do JWT e contém metadados sobre o token. Normalmente, ele inclui o tipo de token, que é "JWT", e o algoritmo de assinatura utilizado, como HMAC SHA256 ou RSA.
Exemplo de um Header:
{
"alg": "HS256",
"typ": "JWT"
}
Este JSON é então codificado em Base64 para formar a primeira parte do token.
Payload
O Payload é onde as informações reais que você deseja transmitir são armazenadas. Ele contém um conjunto de claims, que são declarações sobre uma entidade (normalmente, o usuário) e dados adicionais. Existem três tipos de claims:
- Registered Claims: Claims pré-definidos pela especificação JWT, como
iss
(emissor),exp
(expiração),sub
(assunto) eaud
(público). - Public Claims: Claims que você pode definir livremente e que são acordados entre as partes.
- Private Claims: Claims personalizados usados para troca de informações entre partes que concordam em usá-los.
Exemplo de um Payload:
{
"userId": 123,
"name": "John Doe",
"admin": true
}
Esse payload é codificado em Base64 para formar a segunda parte do JWT.
Signature
A Signature é a terceira e última parte do JWT. Ela é gerada combinando o Header, o Payload, uma chave secreta, e o algoritmo especificado no Header. A Signature garante que o token não foi alterado no caminho entre as partes.
A Signature é gerada da seguinte forma:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Essa Signature é anexada ao final do JWT, criando o token completo.
Implementando JWT em Node.js
Agora que entendemos o que é JWT e como ele funciona, vamos implementar a autenticação JWT em uma aplicação Node.js. Usaremos a biblioteca jsonwebtoken
para criar e verificar tokens.
Passo 1: Instale a biblioteca
Primeiro, você precisa instalar a biblioteca jsonwebtoken
:
npm install jsonwebtoken
Passo 2: Gerando um JWT
Vamos criar um JWT quando um usuário fizer login em nossa aplicação:
const jwt = require('jsonwebtoken');
function login(req, res) {
const userId = 123; // Supomos que este ID vem do banco de dados
const token = jwt.sign({ userId }, 'sua_chave_secreta', { expiresIn: '1h' });
res.json({ token });
}
Neste exemplo, o token é gerado com o ID do usuário e uma chave secreta. O token expira em 1 hora.
Passo 3: Verificando um JWT
Quando o usuário faz uma solicitação a uma rota protegida, o token JWT é enviado no cabeçalho da requisição. Vamos verificar este token para autenticar o usuário:
function verifyToken(req, res, next) {
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send('Token não fornecido.');
}
jwt.verify(token, 'sua_chave_secreta', (err, decoded) => {
if (err) {
return res.status(500).send('Falha ao autenticar o token.');
}
req.userId = decoded.userId;
next();
});
}
Neste exemplo, o token é extraído do cabeçalho authorization
, verificado usando a chave secreta e, se válido, o ID do usuário é decodificado e adicionado ao objeto req
.
Passo 4: Protegendo Rotas
Agora podemos proteger qualquer rota usando o middleware verifyToken
:
app.get('/dados-protegidos', verifyToken, (req, res) => {
res.json({ message: 'Este é um dado protegido.', userId: req.userId });
});
Essa rota só pode ser acessada se o token JWT fornecido for válido.
Vantagens e Desvantagens do JWT
Vantagens:
- Compacto: JWTs são menores que outras formas de tokens e podem ser facilmente enviados via HTTP.
- Autônomo: Contêm todas as informações necessárias para autenticação, evitando consultas adicionais ao banco de dados.
- Flexível: Pode ser usado em várias linguagens e plataformas.
Desvantagens:
- Segurança: Se a chave secreta for comprometida, todos os tokens emitidos se tornam vulneráveis.
- Tamanho: Tokens JWT podem crescer bastante se muitos claims forem adicionados.
Agora já sabe como fazer?
A autenticação JWT é uma solução poderosa e flexível para proteger suas APIs e aplicações web. Embora tenha algumas desvantagens, como o risco de comprometer a chave secreta, suas vantagens superam os pontos negativos, especialmente em sistemas que requerem escalabilidade e facilidade de uso.
Para começar a usar JWT em seus projetos, experimente implementar um sistema básico de login e autenticação com Node.js usando as etapas descritas acima. Ao compreender profundamente como JWTs funcionam, você estará bem equipado para implementar sistemas de autenticação robustos e seguros em suas aplicações.
Leia mais em: wt.io/