17.1. Autenticação e Autorização em APIs NodeJS: Autenticação com JWT
Autenticação e autorização são elementos cruciais na criação de APIs em NodeJS. Elas garantem a segurança dos dados manipulados pela API, permitindo apenas que usuários autorizados acessem determinados recursos. Este capítulo do e-book se concentrará na autenticação com JWT (JSON Web Tokens).
O que é JWT?
JSON Web Tokens (JWT) é um padrão aberto (RFC 7519) que define uma maneira compacta e autônoma de transmitir informações entre partes como um objeto JSON. Essas informações podem ser verificadas e confiáveis porque são assinadas digitalmente. JWTs podem ser assinados usando um segredo (com o algoritmo HMAC) ou um par de chaves pública/privada usando RSA ou ECDSA.
Por que usar JWT para Autenticação?
JWTs são uma boa opção para autenticação por várias razões. Primeiro, eles são stateless. Isso significa que não precisamos armazenar informações de sessão no servidor ou em um banco de dados. Em vez disso, todas as informações necessárias são armazenadas no token e são enviadas ao servidor a cada solicitação. Isso permite que nossa aplicação seja escalável e fácil de gerenciar.
Em segundo lugar, JWTs são compactos e podem ser enviados através de uma URL, em um cabeçalho HTTP, ou em um cookie. Isso os torna muito convenientes para autenticação, especialmente em aplicações de página única (SPA).
Como funciona a Autenticação com JWT?
A autenticação com JWT geralmente envolve os seguintes passos:
- O usuário envia suas credenciais para o servidor.
- O servidor verifica as credenciais e, se forem válidas, gera um JWT que é enviado de volta ao usuário.
- O usuário armazena o JWT de alguma forma (por exemplo, em um cookie ou no armazenamento local).
- O usuário envia o JWT em cada solicitação subsequente ao servidor.
- O servidor verifica o JWT e, se for válido, processa a solicitação.
- Se o JWT não for válido (por exemplo, se expirou), o servidor rejeita a solicitação.
Implementando Autenticação com JWT em NodeJS
Para implementar a autenticação com JWT em NodeJS, precisamos do pacote jsonwebtoken. Podemos instalá-lo usando npm:
npm install jsonwebtoken
Uma vez que o pacote está instalado, podemos usá-lo para gerar e verificar JWTs. Aqui está um exemplo de como podemos fazer isso:
const jwt = require('jsonwebtoken');
// Generate a JWT
const token = jwt.sign({ id: user.id }, 'your-secret-key', { expiresIn: '1h' });
// Verify a JWT
try {
const decoded = jwt.verify(token, 'your-secret-key');
console.log(decoded.id); // will print the id of the user
} catch (err) {
console.error('Invalid token');
}
A função jwt.sign() gera um JWT. Ela recebe três argumentos: o payload (um objeto que contém as informações que queremos armazenar no token), o segredo (uma string usada para assinar o token), e as opções (um objeto que pode conter várias propriedades, como expiresIn, que define quando o token expira).
A função jwt.verify() verifica um JWT. Ela recebe dois argumentos: o token e o segredo. Se o token for válido, ela retorna o payload. Se não for válido, ela lança um erro.
Em resumo, a autenticação com JWT em NodeJS é um processo simples e eficaz que pode melhorar significativamente a segurança de suas APIs. Com o JWT, você pode garantir que apenas usuários autorizados tenham acesso a determinados recursos, tornando sua aplicação mais segura e confiável.