Я создаю блог, используя новейшие технологии MEAN Stack. Вошедший в систему пользователь может создать нового пользователя с ролями «администратор» и «модератор».
Создание нового пользователя с ролью администратора или модератора
Этот маршрут защищен, и в настоящее время только зарегистрированный пользователь может получить к нему доступ. Вот промежуточное ПО для проверки подлинности пользователя.
//check_auth.js
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
try {
const token = req.headers.authorization.split(' ')[1];
jwt.verify(token, 'my_jwt_secret');
next();
} catch (error) {
res.status(401).json({ message: 'Auth failed!'});
}
};Я применяю это промежуточное ПО для защиты от несанкционированного доступа к некоторым из моих маршрутов. Я хочу создать подобное промежуточное ПО, в котором я проверяю, является ли пользователь администратором или нет. Таким образом, я могу применить это промежуточное программное обеспечение на маршруте для создания пользователей, поэтому только авторизованный пользователь и пользователь с ролью «администратор» могут создать нового пользователя.
Я думаю, что это может помочь в создании промежуточного программного обеспечения. Когда пользователь входит в систему, идентификатор, адрес электронной почты и роль сохраняются в файле jwt.
router.post("/login", (req, res, next) => {
let fetchedUser;
User.findOne({ email: req.body.email })
.then(user => {
if (!user) {
return res.status(401).json({
message: "Auth failed"
});
}
fetchedUser = user;
return bcrypt.compare(req.body.password, user.password);
})
.then(result => {
if (!result) {
return res.status(401).json({
message: "Auth failed"
});
}
const token = jwt.sign(
{ email: fetchedUser.email, userId: fetchedUser._id, role: fetchedUser.role },
"my_jwt_secret",
{ expiresIn: "1h" }
);
res.status(200).json({
token: token,
expiresIn: 3600
});
})
.catch(err => {
return res.status(401).json({
message: "Auth failed"
});
});
});Весь код можно найти в моем репозитории GitHub: https://github.com/rajotam/одиннадцать





Добавьте обработчик маршрута ко всем конечным точкам, требующим проверки, и импортируйте его туда, где это необходимо. https://expressjs.com/en/guide/routing.html
бывший.
router.post('/login', verify.isAdmin, (req, res, next) => {
//do something
})
//проверяем функцию в отдельном файле
module.exports = {
isAdmin: (req, res, next) =>{
if (req.user.admin){
next();
}else{
res.status(403).send();
}
}
}
Примеры полного кода:
https://medium.freecodecamp.org/securing-node-js-restful-apis-with-json-web-tokens-9f811a92bb52
Я отредактировал свой ответ с полными примерами кода из среды.
Когда вы создаете токен
const token = jwt.sign(
{ email: fetchedUser.email, userId: fetchedUser._id, role: fetchedUser.role },
"your_jwt_secret",
{ expiresIn: "1h" });
К этому токену добавляются электронное письмо, Идентификатор пользователя и роль. Теперь вы можете использовать их при декодировании токена.
После применения промежуточного программного обеспечения на маршрутах для аутентификации пользователя
// You did this
// jwt.verify(token, 'my_jwt_secret');
// You need to store this into variable so that you can use them
// use them in going request.
const decodedToken = jwt.verify(token, 'your_jwt_secret');
/*
This decodedToken holds email, userId and role
you can pass it to req
req.userId = decodedToken.userId
req.email = decodedToken.email
req.role = decodedToken.role
next()
*/
Здесь находится только важный код, который является блоком try
try {
const token = req.headers.authorization.split(' ')[1];
const decodedToken = jwt.verify(token, 'my_jwt_secret');
req.userId = decodedToken.userId
req.email = decodedToken.email
req.role = decodedToken.role
next()
}
В вашем маршруте
router.post('/login', checkAuthMiddleware, (req, res, next) => {
//Now you have userId, role and email Id to use
const userId = req.userId
const role = req.role
const email = req.email
// Now you can separate user role here
// Write some other logic here
})
const jwt = require("jsonwebtoken");
module.exports = (req, res, next) => {
try {
const token = req.headers.authorization.split(" ")[1];
const decodedToken = jwt.verify(token, process.env.JWT_KEY);
req.userData = { email: decodedToken.email, userId: decodedToken.userId, role: decodedToken.role};
next();
} catch (error) {
res.status(401).json({ message: "You are not authenticated!" });
}
};
Я знаю, что должен сделать это таким образом, поскольку я уже создал промежуточное программное обеспечение для проверки подлинности пользователя или нет. Я не уверен, как извлечь роль из токена и проверить, является ли пользователь администратором?