O desenvolvimento de aplicações web modernas requer atenção especial à segurança. Um dos aspectos mais críticos é a autenticação, especialmente quando se trata de APIs REST. Neste tutorial, exploraremos como implementar um sistema de autenticação robusto usando Node.js e JSON Web Tokens (JWT). Junte-se a nós enquanto abordamos tudo, desde a instalação até a implantação completa.
O que é JWT?
JSON Web Tokens (JWT) é um padrão aberto que define uma maneira compacta e independente de transmitir informações entre partes como um objeto JSON. Essas informações podem ser verificadas e confiáveis porque são assinadas digitalmente. A autenticação via JWT não é apenas segura, mas também altamente escalável.
Vantagens de Usar JWT
Uma das principais vantagens de usar JWT em relação a outras técnicas de autenticação é sua natureza independente. Isso significa que os tokens contêm todas as informações necessárias para a autenticação, eliminando a necessidade de manter sessões no servidor. Outro benefício essencial é o suporte ao CORS, crucial no desenvolvimento de APIs que precisam ser acessíveis a partir de diferentes domínios.
Configurando o Ambiente
Antes de começar, certifique-se de ter o Node.js instalado. Você precisará instalar algumas dependências: express, jsonwebtoken e bcrypt. Isso pode ser feito executando o seguinte comando:
$ npm install express jsonwebtoken bcrypt
Estrutura Básica do Projeto
Você pode estruturar seu projeto da seguinte forma:
|-- src | |-- index.js |-- middlewares | |-- auth.js
index.js será nosso ponto de entrada, enquanto auth.js cuidará das funções relacionadas à autenticação.
Criando uma API básica
A seguir, criaremos uma API básica com Express:
// index.js const express = require(express); const app = express(); app.use(express.json()); app.get(/, (req, res) => { res.send(API working!); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(Servidor em execução na porta ${PORT}
); });
Implementando JWT para autenticação
Código do middleware auth.js
// auth.js const jwt = require(jsonwebtoken); const secretKey = my_secret_key; module.exports.authenticateToken = (req, res, next) => { const token = req.header(x-access-token); if (!token) return res.status(403).send(Acesso negado.); try { const verified = jwt.verify(token, secretKey); req.user = verified; next(); } catch (err) { res.status(401).send(Token inválido); } };
Aqui, definimos um middleware simples que autentica a validade dos tokens passados nos cabeçalhos HTTP.
Manipulação de usuários e geração de tokens
Em seguida, implementamos as rotas para registrar usuários e gerar tokens:
// index.js const bcrypt = require(bcrypt); const jwt = require(jsonwebtoken); const users = []; app.post(/register, async(req, res) => { try { const salt = await bcrypt.genSalt(10); const hashPassword = await bcrypt.hash(req.body.password, salt); const user = { name: req.body.name, password: hashedPassword }; users.push(user); res.status(201).send(Usuário registrado!); } catch (err) { res.status(500).send(err.message); app.post(/login, async(req, res) => { const user = users.find((user) => user.name === req.body.name); if (!user) return res.status(404).send(Usuário não encontrado); try { const validPassword = await bcrypt.compare(req.body.password, user.password); if (!validPassword) return res.status(400).send(Senha inválida); const token = jwt.sign({ _id: user._id }, my_secret_key); res.header(x-access-token, token).send(Login bem-sucedido! } catch (err) { res.status(500).send(err.message);
Agora adicionamos rotas para registro e login. Após o login bem-sucedido, um token JWT será gerado e retornado ao cliente.
Explore mais sobre a tecnologia aqui