No mundo do desenvolvimento web atual, as APIs REST tornaram-se um padrão para permitir a comunicação entre diferentes aplicações. O Node.js, graças à sua robustez e flexibilidade, é uma das plataformas mais utilizadas para a criação de APIs eficientes e escaláveis. Neste tutorial, vamos nos concentrar na criação de uma API REST em Node.js que inclui autenticação usando JSON Web Tokens (JWT), um método seguro para transmitir informações entre partes como um objeto JSON. Por que usar JWT para autenticação? O uso de JWT para autenticação e gerenciamento de sessão é popular porque ele é autossuficiente, ou seja, contém todas as informações necessárias sobre o usuário. Além disso, é seguro porque possui assinatura digital. Isso reduz a necessidade de armazenar informações no servidor, tornando-os ideais para APIs escaláveis.

Configurando nosso projeto Node.js

Primeiro, criaremos um novo projeto Node.js usando o npm:

$ mkdir myapi && cd myapi
$ npm init -y

Em seguida, instalaremos as bibliotecas necessárias:

$ npm install express jsonwebtoken bcryptjs

Estas incluem Express, um framework popular do Node.js; jsonwebtoken, para lidar com JWTs; e bcryptjs, para criptografar senhas.

Criando o Servidor Básico

Abrimos nosso arquivo index.js e implementamos um servidor básico:

const express = require(express);
const app = express();
app.use(express.json());
app.listen(3000, () => console.log(Servidor em execução na porta 3000));

Este código inicia um servidor na porta 3000 e habilita o processamento de JSON solicitações.

Gerenciamento e segurança de usuários

Adicionaremos endpoints básicos para registrar usuários e gerenciar sua autenticação. Criaremos um controlador simples para isso:

// Simulação de banco de dados
let users = [];

app.post(/register, async (req, res) => {
const { username, password } = req.body;
const hashedPassword = await bcrypt.hash(password, 10);
users.push({ username, password: hashedPassword });
res.status(201).send(Usuário registrado com sucesso);
});

app.post(/login, async (req, res) => {
const { username, password } = req.body;
const user = users.find(user => user.username === username);

if (!user || )) {
return res.status(401).send(Credenciais inválidas);
}

const token = jwt.sign({ username: user.username }, secretkey);
res.json({ token });
});

Protegendo nossas rotas com JWT

Para proteger nossas rotas, você precisará de uma função middleware que valida os tokens:

const authenticateJWT = (req, res, next) => {
const token = req.header(Authorization);

if (!token) return res.sendStatus(403);

jwt.verify(token.split( )[1], secretkey, (err, user) => {
if (err) return res.sendStatus(403);

req.user = user;
next();
});
};

Então podemos usar esta função em qualquer rota que queiramos proteger.

Juntando tudo

Você pode ver como esses recursos combinados permitem criar aplicativos robustos. Ao usar JWTs, não apenas protegemos nossas rotas VPN e criptografia segura, mas também melhoramos a experiência do usuário, eliminando a necessidade constante de fazer login.

Saiba mais sobre desenvolvimento com Mox aqui.