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

Я создаю блог с использованием новейших технологий MEAN Stack.Зарегистрированный пользователь может создать нового пользователя с ролями «admin» и «модератор».

Создание нового пользователя с ролью администратора или роли модератора

Этот маршрутзащищен и в настоящее время только авторизованный пользователь может получить к нему доступ.Вот промежуточное ПО для проверки того, аутентифицирован ли пользователь или нет.

//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/Eleven

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

При создании токена к этому токену добавляются

const token = jwt.sign(
 { email: fetchedUser.email, userId: fetchedUser._id, role: fetchedUser.role },
 "your_jwt_secret",
 { expiresIn: "1h" });

электронная почта , userId и роль .Теперь вы можете использовать их при расшифровке токена.

После применения промежуточного программного обеспечения на маршрутах для аутентификации пользователя

 // 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 {
    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
})
0 голосов
/ 07 февраля 2019

Добавьте обработчик маршрута ко всем конечным точкам, которые нуждаются в проверке, и импортируйте его, где это необходимо.https://expressjs.com/en/guide/routing.html

ex.

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

...