O desenvolvimento de aplicações web modernas exige atenção especial à segurança. Um dos aspectos mais críticos é a autenticação, principalmente ao lidar com APIs REST. Neste tutorial, exploraremos como implementar um sistema de autenticação robusto usando Node.js e JSON Web Tokens (JWT). Acompanhe-nos neste guia, onde abordaremos tudo, da instalação à implementação completa. O que é JWT? JSON Web Tokens (JWT) é um padrão aberto que define uma maneira compacta e autocontida de transmitir informações entre partes como um objeto JSON. Essas informações podem ser verificadas e consideradas confiáveis, pois 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 comparação com outras técnicas de autenticação é sua natureza autocontida. 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 é a sua compatibilidade com CORS, que é crucial ao desenvolver APIs que precisam ser acessíveis 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 como mostrado abaixo:

|-- src | |-- index.js |-- middlewares | |-- auth.js 

index.js será nosso ponto de entrada, enquanto auth.js lidará com as funções relacionadas à autenticação.

Criamos 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 funcionando!\"); }); 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 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

A seguir, 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 hashedPassword = 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 incorreta\"); const token = jwt.sign({ _id: user._id }, my_secret_key); res.header(\"x-access-token\", token).send(\"Login realizado com sucesso!\"); } catch (err) { res.status(500).send(err.message); } }); 

Adicionamos rotas para registro e login. Após o login bem-sucedido, um token JWT será gerado e retornado ao cliente.

Explore mais sobre tecnologia aqui