Uma das partes mais importantes de qualquer aplicação é a segurança e a maneira como lidamos com a autenticação e autorização. Isso é especialmente verdadeiro ao criar APIs, onde precisamos garantir que apenas usuários autenticados e autorizados possam acessar certos dados e funcionalidades. Neste capítulo, vamos explorar como criar uma API REST básica com NodeJS e ExpressJS, com foco na autenticação e autorização.
Autenticação
Autenticação é o processo de verificar a identidade de um usuário. Em outras palavras, é como confirmamos que um usuário é quem ele diz ser. Existem várias maneiras de fazer isso, mas uma das mais comuns é através do uso de nomes de usuário e senhas.
Para implementar a autenticação em nossa API, primeiro precisamos instalar algumas dependências. Vamos usar o pacote 'bcrypt' para hashear as senhas dos usuários e o pacote 'jsonwebtoken' para gerar tokens de autenticação.
$ npm install bcrypt jsonwebtoken
Com as dependências instaladas, podemos começar a implementar a autenticação. Primeiro, vamos criar uma rota para o registro de usuários. Nesta rota, vamos hashear a senha do usuário antes de armazená-la no banco de dados.
const express = require('express'); const bcrypt = require('bcrypt'); const User = require('../models/User'); const router = express.Router(); router.post('/register', async (req, res) => { const hashedPassword = await bcrypt.hash(req.body.password, 10); const user = new User({ username: req.body.username, password: hashedPassword }); await user.save(); res.status(201).send({ message: 'User registered successfully' }); });
Agora, vamos criar uma rota para o login dos usuários. Nesta rota, vamos verificar se a senha fornecida corresponde à senha armazenada no banco de dados. Se a senha estiver correta, vamos gerar um token de autenticação e enviá-lo ao usuário.
const jwt = require('jsonwebtoken'); router.post('/login', async (req, res) => { const user = await User.findOne({ username: req.body.username }); if (!user || !await bcrypt.compare(req.body.password, user.password)) { return res.status(401).send({ message: 'Invalid username or password' }); } const token = jwt.sign({ id: user._id }, 'your_jwt_secret'); res.send({ token }); });
Autorização
Autorização é o processo de verificar se um usuário tem permissão para realizar uma ação específica. Em outras palavras, é como determinamos o que um usuário pode e não pode fazer. Existem várias maneiras de fazer isso, mas uma das mais comuns é através do uso de tokens de autenticação.
Vamos criar um middleware para verificar o token de autenticação dos usuários. Se o token for válido, vamos armazenar o ID do usuário no objeto de solicitação e chamar a próxima função. Se o token não for válido, vamos retornar uma resposta com o status 401 (Não Autorizado).
const jwt = require('jsonwebtoken'); const authenticate = (req, res, next) => { const token = req.headers.authorization; if (!token) { return res.status(401).send({ message: 'No token provided' }); } jwt.verify(token, 'your_jwt_secret', (err, decoded) => { if (err) { return res.status(401).send({ message: 'Invalid token' }); } req.userId = decoded.id; next(); }); };
Agora, podemos usar este middleware em qualquer rota que requer autenticação. Por exemplo, podemos criar uma rota para obter os detalhes do usuário autenticado.
router.get('/me', authenticate, async (req, res) => { const user = await User.findById(req.userId); res.send(user); });
Com isso, concluímos a criação de uma API REST básica com NodeJS e ExpressJS, com autenticação e autorização. Lembre-se, a segurança é um aspecto crucial de qualquer aplicação e deve ser levada a sério desde o início do desenvolvimento.