Estoy trabajando en un proyecto de comercio electrónico y solo quiero permitir que los usuarios con administrador puedan crear y actualizar productos en la colección de productos (base de datos MongoDB), pero de alguna manera me estoy equivocando porque cuando uso un usuario con el token verdadero de administrador como token de portador en la autorización, recibo el error de captura
este es mi código de modelo de usuario
import mongoose from "mongoose"; import bcrypt from 'bcrypt' import dotenv from 'dotenv' dotenv.config() const userSchema = new mongoose.Schema({ username:{ required:true, type:String }, email:{ type:String, unique:true, required:true, }, password:{ type:String, required:String }, profilePic:{ type:String, required:true, default:'https://t3.ftcdn.net/jpg/03/46/83/96/360_F_346839683_6nAPzbhpSkIpb8pmAwufkC7c5eD7wYws.jpg' }, admin:{ type:Boolean, required:true, default:false } }, { timestamps: true });
mi código de Middleware para la protección para la creación de productos
import jwt from 'jsonwebtoken' import asyncHandler from 'express-async-handler' import userModel from '../models/user.model.js' export const productCreationProtection = asyncHandler(async(req, res, next) => { let authorizationToken; if(req.headers.authorization && req.headers.authorization.startsWith('Bearer')){ try { authorizationToken = req.headers.authorization.split(" ")[1] // decode user id const decode = jwt.verify(authorizationToken, process.env.PRIVATE_KEY) // Find the userModel and we use select to exclude password for find req.user = await userModel.findOne(decode.id).select('admin') next(); } catch (error) { res.sendStatus(401) throw new Error("You're not authorized to performe this function") } } if(!authorizationToken){ res.sendStatus(401) throw new Error("Not Authourized to performe this action") } });
El método findOne
toma un objeto como parámetro pero está pasando una cadena. Si está tratando de encontrar un usuario con una ID dada, intente refactorizar su código como se muestra a continuación:
req.user = await userModel.findOne({ _id: decode.id }).select('admin') // Check if admin field is true if (!req.user.admin) { return "Forbidden" } next()
Esto devolverá el documento donde _id
es igual a decode.id
. Reemplace _id
si está consultando en función de cualquier otro campo.
Alternativamente, también puede agregar un campo de administración en la consulta misma:
const user = await userModel.findOne({ _id: decode.id, admin: true }) if (!user) { // User with given ID not found or is not an admin return "Forbidden" } next();