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:

  1. Header (Cabeçalho)
  2. Payload (Corpo)
  3. 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:

  1. Registered Claims: Claims pré-definidos pela especificação JWT, como iss (emissor), exp (expiração), sub (assunto) e aud (público).
  2. Public Claims: Claims que você pode definir livremente e que são acordados entre as partes.
  3. 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.

Quer acompanhar as novidade do site?

Leia mais em: wt.io/

Como implementar a autenticação JWT em Aplicações Web?

Última atualização: 2024-08-21

Exemplos de uso


Palavras-Chaves