У меня есть конечная точка localhost:3000/users/add
и localhost:3000/users/login
. Когда пользователь входит на сервер, возвращает Jsonwebtoken с двумя свойствами в следующем формате: user: { username: 'user_name', access_level: 4 }
. Затем у меня есть пользовательское промежуточное ПО auth
, которое проверяет уровень доступа пользователя, и я использую его для защиты localhost:3000/users/add
. Маршрут выглядит следующим образом:
router. js:
router.post('/add', auth, async (req, res, next) => {
// get user input
const user = req.body;
try {
const data = await Helper.validateUserInput(user)
// encrypt password
const hash = await Helper.encryptPassword(data.value.password)
if(hash) {
const databaseUser = new User({
'username': data.value.username,
'password': hash,
'access_level': data.value.access_level
});
// persist to database
const saved = await databaseUser.save();
console.log(saved);
res.status(200).json({success: true, message: `User successfully added`})
}
}
// if there's an error
catch(error){
if(error.hasOwnProperty('code')) {
const error_code = error.code;
if(error_code === 11000) {
return res.status(400).json({
success: false,
error_message: error.errmsg
})
}else {
return res.status(500).json({
success: false,
error: error
})
}
}
}
});
Функция промежуточного программного обеспечения аутентификации выглядит следующим образом:
auth. js:
const Helper = require('../helpers/helpers')
module.exports = function async (req, res, next) {
const token = req.query.token;
if(!token) {
res.status(403).json({
success: false,
error_message: `Forbiden - Invalid credentials!`
})
}
Helper.verify_token(token)
.then((user) => {
const { access_level } = user.user;
console.log(access_level)
if(access_level != 4) {
res.status(401).json ({
success: false,
error_message: `Unauthorized - Invalid credentials!`
})
}else {
next()
}
})
.catch((err) => {
res.status(403).json({
success: false,
error_message: `Forbiden - Invalid credentials!`
})
})
}
Затем я пытаюсь получить доступ к защищенному маршруту, и почтальон просто зависает и не дает ответа. Что странно, так это то, что если я изменю if statement
в auth.js
, например:
if(access_level != 1) {
res.status(401).json ({
success: false,
error_message: `Unauthorized - Invalid credentials!`
})
}else {
next()
}
, все будет работать нормально. Я действительно не понимаю, в чем здесь проблема.