Um dos tópicos mais importantes que abordaremos em nosso curso e-book 'Como criar APIs em NodeJS do básico ao avançado' é o uso de JSON Web Tokens (JWT) em NodeJS. JWT é uma maneira segura de transmitir informações entre partes como um objeto JSON. Essa informação pode ser verificada e confiável porque é assinada digitalmente. JWTs podem ser assinados usando um segredo (com o algoritmo HMAC) ou um par de chaves público/privado usando RSA ou ECDSA.
O JWT é composto por três partes: o cabeçalho, a carga útil e a assinatura. O cabeçalho tipicamente consiste no tipo do token e no algoritmo de assinatura usado. A carga útil contém as reivindicações ou as peças de informação que estão sendo passadas. A assinatura é usada para verificar que o remetente do JWT é quem diz ser e para garantir que a mensagem não foi alterada ao longo do caminho.
Um dos aspectos mais cruciais do trabalho com JWT é a configuração da expiração do token. A expiração de um token é importante porque ajuda a proteger o aplicativo de possíveis ameaças de segurança. Tokens que não expiram podem ser perigosos, pois se um ator mal-intencionado conseguir um, ele terá acesso contínuo ao sistema.
Em NodeJS, podemos usar a biblioteca jsonwebtoken para trabalhar com JWT. Para instalar esta biblioteca, você pode usar o comando npm:
npm install jsonwebtoken
Depois que a biblioteca estiver instalada, você pode começar a usá-la para criar e verificar tokens. Aqui está um exemplo de como criar um token com uma expiração definida:
const jwt = require('jsonwebtoken'); const data = { id: 1, name: 'John Doe' }; const secret = 's3cr3t'; const token = jwt.sign(data, secret, { expiresIn: '1h' });
Neste exemplo, 'data' é o objeto que queremos codificar no token. 'Secret' é a chave secreta que será usada para assinar o token. O objeto final passado para a função jwt.sign é um objeto de opções. A opção 'expiresIn' permite definir a expiração do token. Neste caso, o token expirará em uma hora.
Para verificar um token, você pode usar a função jwt.verify. Aqui está um exemplo:
const jwt = require('jsonwebtoken'); const token = '...'; // o token que você recebeu const secret = 's3cr3t'; try { const decoded = jwt.verify(token, secret); console.log(decoded); } catch (err) { console.error('Token inválido:', err); }
Se o token for válido e não tiver expirado, jwt.verify retornará o objeto decodificado. Se o token for inválido ou tiver expirado, ele lançará um erro.
É importante notar que você deve sempre proteger a chave secreta usada para assinar os tokens. Se um ator mal-intencionado obtiver sua chave secreta, ele poderá assinar seus próprios tokens e obter acesso ao seu sistema. Portanto, em um ambiente de produção, você deve usar uma solução de gerenciamento de segredos para proteger suas chaves.
Além disso, embora os JWTs sejam uma maneira conveniente de transmitir informações entre o cliente e o servidor, eles não devem ser usados para armazenar informações sensíveis, a menos que sejam criptografados. Isso ocorre porque o conteúdo de um JWT pode ser facilmente decodificado e lido por qualquer pessoa que obtenha o token.
Em resumo, JWTs são uma ferramenta poderosa para autenticação e autorização em aplicações NodeJS. Eles permitem que você transmita informações de maneira segura entre partes e podem ser facilmente configurados para expirar após um determinado período de tempo, ajudando a aumentar a segurança do seu aplicativo.