Para adicionar um sistema de segurança aos códigos acima, você pode usar uma chave secreta para criptografar e assinar as requisições HTTP. Isso garante que as requisições só possam ser realizadas pelo cliente autorizado.
Um exemplo de como fazer isso é usando o módulo "jsonwebtoken" do Node.js para criar e verificar tokens JWT (JSON Web Token).
Primeiro, você precisa instalar o módulo "jsonwebtoken" usando o comando "npm install jsonwebtoken":
npm install jsonwebtoken
Depois, você pode usar o módulo para criar um token JWT para cada cliente autorizado. O token deve conter um "id" do cliente e uma "chave secreta" compartilhada pelo cliente e pelo servidor. O código ficaria assim:
const jwt = require('jsonwebtoken');
const chaveSecreta = 'chave_secreta';
// Função para criar um token JWT para o cliente
const criarToken = (id) => {
return jwt.sign({ id }, chaveSecreta, { expiresIn: '1h' });
}
// Rota para criar um token para o cliente
app.post('/login', (req, res) => {
// Verifica as credenciais do cliente (por exemplo, usuário e senha)
const credenciaisValidas = verificarCredenciais(req.body.usuario, req.body.senha);
if (credenciaisValidas) {
// Se as credenciais forem válidas, cria um token JWT para o cliente
const token = criarToken(req.body.usuario);
res.send({ token });
} else {
// Se as credenciais não forem válidas, envia um erro
res.status(401).send('Usuário ou senha inválidos');
}
});
Depois de criar um token para o cliente, você pode adicionar uma função de verificação de autenticação em cada rota que precisa de autenticação. A função deve verificar se o token enviado pelo cliente é válido usando a chave secreta compartilhada. O código ficaria assim:
// Função para verificar se o token é válido
const verificarToken = (req, res, next) => {
// Verifica se o token foi enviado na requisição
const token = req.headers['x-access-token'];
if (!token) {
return res.status(401).send('Token não enviado');
}
// Verifica se o token é válido usando a chave secreta
jwt.verify(token, chaveSecreta, (err, decoded) => {
if (err) {
return res.status(401).send('Token inválido');
}
// Se o token for válido, adiciona o "id" do cliente na requisição
// para uso posterior
req.clienteId = decoded.id;
next();
});
}
// Adiciona a função de verificação de autenticação em todas as rotas
// que precisam de autenticação
app.post('/produtos', verificarToken, (req, res) => {
// O código da rota fica aqui
});
app.put('/produtos/:id', verificarToken, (req, res) => {
// O código da rota fica aqui
});
app.delete('/produtos/:id', verificarToken, (req, res) => {
// O código da rota fica aqui
});
Com isso, todas as rotas que precisam de autenticação passarão pelo processo de verificação de token antes de executar o código da rota. Se o token for válido, a rota será executada normalmente. Se o token for inválido ou não existir, a função enviará uma resposta de erro para o cliente.