17.2. Autenticação e Autorização em APIs NodeJS: Autorização com Roles e Permissões
Na criação de APIs robustas e seguras em NodeJS, a autenticação e a autorização são aspectos críticos que garantem a segurança e a integridade dos dados. A autenticação é o processo de verificação da identidade do usuário, enquanto a autorização é o processo de verificação das permissões do usuário autenticado. Neste capítulo, vamos nos concentrar na autorização com roles e permissões.
Entendendo Roles e Permissões
Em uma aplicação, diferentes usuários podem ter diferentes níveis de acesso. Por exemplo, em um sistema de gerenciamento de projetos, um usuário pode ser um 'Administrador', 'Gerente' ou 'Colaborador'. Cada um desses roles pode ter diferentes permissões. Um 'Administrador' pode ter permissão para criar, ler, atualizar e excluir qualquer projeto, enquanto um 'Gerente' pode apenas criar, ler e atualizar projetos, mas não excluí-los. Um 'Colaborador' pode apenas ler projetos. Esses são os roles e permissões.
Implementando Autorização com Roles e Permissões em NodeJS
Para implementar a autorização com roles e permissões em NodeJS, precisamos primeiro criar um modelo de usuário que inclua o role do usuário. Em seguida, precisamos criar uma função middleware que verifique o role do usuário e conceda ou negue acesso com base nesse role.
1. Criando o Modelo de Usuário
Podemos usar o Mongoose, um ODM (Object Data Modeling) popular para MongoDB, para criar nosso modelo de usuário. Aqui está um exemplo de como o modelo de usuário pode parecer:
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
name: String,
email: String,
password: String,
role: {
type: String,
enum: ['Admin', 'Manager', 'Contributor'],
default: 'Contributor'
}
});
module.exports = mongoose.model('User', UserSchema);
2. Criando a Função Middleware
Em seguida, precisamos criar uma função middleware que verifique o role do usuário. Podemos fazer isso usando o JWT (JSON Web Token), um padrão de token de acesso que permite a autenticação entre duas partes. Quando um usuário se autentica, um token JWT é gerado e enviado ao usuário. Esse token contém informações sobre o usuário, incluindo seu role. Aqui está um exemplo de como a função middleware pode parecer:
const jwt = require('jsonwebtoken');
function authRole(role) {
return (req, res, next) => {
const token = req.header('auth-token');
if (!token) return res.status(401).send('Access Denied');
try {
const verified = jwt.verify(token, process.env.TOKEN_SECRET);
if (verified.role !== role) return res.status(403).send('Forbidden');
req.user = verified;
next();
} catch (err) {
res.status(400).send('Invalid Token');
}
};
}
module.exports = authRole;
Com essa função middleware, podemos proteger nossas rotas com base no role do usuário. Por exemplo, podemos proteger a rota de exclusão de projeto para que apenas os usuários 'Admin' possam acessá-la:
const express = require('express');
const router = express.Router();
const authRole = require('../middleware/authRole');
router.delete('/project/:id', authRole('Admin'), (req, res) => {
// Delete project
});
Em resumo, a autorização com roles e permissões é uma parte essencial da criação de APIs seguras em NodeJS. Ela permite que você controle o acesso a diferentes partes de sua aplicação com base no role do usuário. Implementar isso corretamente pode ajudar a prevenir o acesso não autorizado e a proteger os dados de sua aplicação.