JSON Web Tokens (JWT) é uma maneira popular de adicionar autenticação e autorização a aplicativos da web e móveis. Em NodeJS, você pode usar o pacote jsonwebtoken para criar, verificar e decodificar tokens JWT. Nesta seção, exploraremos como trabalhar com JWTs em NodeJS e como adicionar informações extras a um token JWT.
Primeiramente, é importante entender o que é um JWT. Um JWT é uma representação compacta e segura de uma série de reivindicações que podem ser trocadas entre duas partes. As reivindicações são informações que você deseja transmitir de forma segura entre as partes. Um token JWT consiste em três partes: um cabeçalho, um payload e uma assinatura.
O cabeçalho geralmente contém duas partes: o tipo do token, que é JWT, e o algoritmo de assinatura, como HMAC SHA256 ou RSA. O payload contém as reivindicações que você deseja transmitir. As reivindicações podem ser declarações sobre uma entidade (geralmente o usuário) e dados adicionais. A assinatura é usada para verificar se o remetente do JWT é quem diz ser e para garantir que a mensagem não foi alterada ao longo do caminho.
Para começar a trabalhar com JWTs em NodeJS, você precisará instalar o pacote jsonwebtoken. Você pode fazer isso usando o npm, o gerenciador de pacotes NodeJS, com o comando: npm install jsonwebtoken.
Uma vez instalado, você pode importar o pacote jsonwebtoken em seu código com o seguinte comando: const jwt = require('jsonwebtoken').
Para criar um token JWT, você pode usar o método jwt.sign(). Este método aceita três argumentos: o payload, uma chave secreta e um objeto de opções. O payload é o conjunto de reivindicações que você deseja incluir no token. A chave secreta é usada para assinar o token e garantir sua integridade. O objeto de opções pode incluir várias opções, como o algoritmo de assinatura a ser usado e a vida útil do token.
Por exemplo, você pode criar um token JWT com as seguintes reivindicações: usuário ID e nome do usuário, da seguinte maneira:
let payload = { userId: '123', userName: 'John Doe' }; let secretKey = 'mySecretKey'; let options = { algorithm: 'HS256', expiresIn: '1h' }; let token = jwt.sign(payload, secretKey, options);
O token resultante será uma string que você pode transmitir para o cliente. O cliente pode então usar este token para autenticar solicitações subsequentes.
Para adicionar informações extras a um token JWT, você pode simplesmente adicionar mais propriedades ao objeto payload. Por exemplo, se você quiser adicionar o e-mail do usuário e o papel do usuário, você pode fazer o seguinte:
let payload = { userId: '123', userName: 'John Doe', userEmail: 'john.doe@example.com', userRole: 'admin' }; let token = jwt.sign(payload, secretKey, options);
Essas informações extras serão incluídas no token JWT e podem ser usadas para tomar decisões de autorização no servidor. Por exemplo, você pode verificar o papel do usuário para determinar se ele tem permissão para acessar um recurso específico.
Para verificar um token JWT e extrair as reivindicações, você pode usar o método jwt.verify(). Este método aceita três argumentos: o token, a chave secreta e um objeto de opções. O método retorna o payload se o token for válido e lança um erro se o token for inválido ou expirado.
Por exemplo, você pode verificar um token e extrair as reivindicações da seguinte maneira:
let token = '...'; // o token JWT recebido do cliente try { let payload = jwt.verify(token, secretKey); console.log(payload); } catch (err) { console.log('Token inválido ou expirado'); }
O objeto payload resultante conterá todas as reivindicações que você incluiu ao criar o token, incluindo as informações extras que você adicionou.
Em resumo, os JWTs são uma maneira poderosa e flexível de adicionar autenticação e autorização a seus aplicativos NodeJS. Você pode incluir qualquer informação que desejar no token, desde que esteja ciente de que as informações no token podem ser lidas por qualquer pessoa que possua o token. Portanto, você deve evitar incluir informações sensíveis no token, a menos que o token seja criptografado.