Я бы предложил добавить массив permissions
, хранящийся у пользователя.Таким образом, вы более гибки.Тогда
const auth = (allowedPermission) => (async (req, res, next) => {
try {
const token = req.header('Authorization').replace('Bearer ', '')
const decoded = jwt.verify(token, process.env.JWT_SECRET)
const user = await User.findOne({ _id: decoded._id, 'tokens.token': token })
if (!user) { // If no user is found
throw new Error()
}
if (!user.permissions.includes(allowedPermission)){
throw new Error() // Forbidden 403
}
// if there's a user
req.token = token
req.user = user
next()
} catch (e) {
res.status(401).send({ error: 'Please authenticate.' })
}
})
и на маршруте
router.get('/itemShipmentStatus', auth([admin, user]), async (req, res) => {
// Get the items shipment status from db.
})
Тогда будет необходимо определить правильный код для запуска.
Я бы предложил рассмотреть вопрос о разделенииapi.Публичный API и API администратора.Это связано с тем, что концептуально пользователь может захотеть быть администратором и получить доступ к своему собственному itemShipmentStatus.Таким образом, наличие
router.get('/itemShipmentStatus', auth([admin, user]), async (req, res) => {
// Get the items shipment status from db.
})
router.get('/admin/itemShipmentStatus', auth([admin]), async (req, res) => {
// Get the items shipment status from db of all user.
})
Это позволяет пользователю с правами администратора протестировать API как обычный пользователь и получить весь статус администратора.