18.10. Trabalhando com JSON Web Tokens (JWT) em NodeJS
JSON Web Tokens (JWT) é um padrão aberto (RFC 7519) que define uma maneira compacta e segura de transmitir informações entre partes como um objeto JSON. Essas informações podem ser verificadas e confiáveis porque são digitalmente assinadas. JWTs podem ser assinados usando um segredo (com o algoritmo HMAC) ou um par de chaves pública/privada usando RSA ou ECDSA.
A autenticação baseada em JWT é uma maneira popular de realizar autenticação em aplicações web. Com a autenticação JWT, um token é armazenado no cliente, que é enviado em cada solicitação para o servidor para ser autenticado.
Como implementar a autenticação baseada em JWT em uma API NodeJS
Para implementar a autenticação baseada em JWT em uma API NodeJS, você precisará das seguintes etapas:
- Instalar o pacote jsonwebtoken
- Criar uma rota de login para gerar o token
- Verificar o token em cada solicitação
1. Instalar o pacote jsonwebtoken
Primeiro, você precisará instalar o pacote jsonwebtoken em seu projeto NodeJS. Você pode fazer isso usando o npm (Node Package Manager) com o seguinte comando:
npm install jsonwebtoken
2. Criar uma rota de login para gerar o token
Em seguida, você precisará criar uma rota de login que irá gerar o token JWT. Aqui está um exemplo de como você pode fazer isso:
const jwt = require('jsonwebtoken');
const express = require('express');
const app = express();
app.post('/login', (req, res) => {
// Authenticate User
const user = {
id: 1,
username: 'test',
email: 'test@test.com'
}
jwt.sign({user: user}, 'secretkey', (err, token) => {
res.json({
token: token
});
});
});
No exemplo acima, primeiro autenticamos o usuário. Em seguida, usamos a função jwt.sign para criar o token JWT. A função jwt.sign leva três parâmetros: a carga útil (neste caso, o objeto do usuário), a chave secreta e uma função de callback.
3. Verificar o token em cada solicitação
Finalmente, você precisará verificar o token JWT em cada solicitação. Você pode fazer isso criando um middleware que verifica o token:
function authenticateToken(req, res, next) {
const bearerHeader = req.headers['authorization'];
if (typeof bearerHeader !== 'undefined') {
const bearer = bearerHeader.split(' ');
const bearerToken = bearer[1];
req.token = bearerToken;
next();
} else {
res.sendStatus(403);
}
}
app.get('/api', authenticateToken, (req, res) => {
jwt.verify(req.token, 'secretkey', (err, authData) => {
if(err) {
res.sendStatus(403);
} else {
res.json({
message: 'API accessed successfully',
authData
});
}
});
});
No exemplo acima, o middleware authenticateToken verifica se o token JWT está presente no cabeçalho da autorização. Se o token estiver presente, ele é verificado usando a função jwt.verify. Se o token for válido, a solicitação é permitida para continuar. Se o token não for válido, um status de erro 403 (Proibido) é enviado.
E isso é tudo que você precisa para implementar a autenticação baseada em JWT em uma API NodeJS!