Создание функции промежуточного программного обеспечения для проверки того, равна ли роль пользователя «Администратору»

Я создаю блог, используя новейшие технологии 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/одиннадцать

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
7 695
3

Ответы 3

Добавьте обработчик маршрута ко всем конечным точкам, требующим проверки, и импортируйте его туда, где это необходимо. 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.com/@maison.moa/using-jwt-json-web-tokens-to-authorize-users-and-protect-api-routes-3e04a1453c3e

https://medium.freecodecamp.org/securing-node-js-restful-apis-with-json-web-tokens-9f811a92bb52

Я знаю, что должен сделать это таким образом, поскольку я уже создал промежуточное программное обеспечение для проверки подлинности пользователя или нет. Я не уверен, как извлечь роль из токена и проверить, является ли пользователь администратором?

Aldin Muratovic 07.02.2019 19:08

Я отредактировал свой ответ с полными примерами кода из среды.

gbraide 07.02.2019 20:20

Когда вы создаете токен

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!" });
  }
};

Другие вопросы по теме