Как я могу проверить зарегистрированного пользователя в аутентификации пользователя в Mean Stack (Node.js + Mongodb)? - PullRequest
1 голос
/ 20 февраля 2020

У меня есть система входа с токенами. При входе в систему он проверяет, существует ли такой пользователь, не имеет информации о текущем пользователе во время сеанса входа. Какой самый простой способ проверить это и отправить ответ веб-интерфейсу?

Маршруты:

function verifyToken(req, res, next) {
  if (!req.headers.authorization) {
    return res.status(401).send('Unauthorized request');
  }
  let token = req.headers.authorization.split(' ')[1];
  if (token === 'null') {
    return res.status(401).send('Unauthorized request');
  }
  let payload = jwt.verify(token, 'secretKey');
  if (!payload) {
    return res.status(401).send('Unauthorized request');
  }
  req.userId = payload.subject;
  next();
}
router.post('/register', (req, res) => {
  let userData = req.body;
  let user = new User(userData);
  user.save((error, registeredUser) => {
    if (error) {
      console.log(error);
    } else {
      let payload = { subject: registeredUser._id };
      let token = jwt.sign(payload, 'secretKey');
      res.status(200).send({ token });
    }
  })
})
router.post('/login', (req, res) => {
  let userData = req.body;

  User.findOne({ email: userData.email }, (error, user) => {
    if (error) {
      console.log(error);
    } else {
      if (!user) {
        res.status(401).send('Invalid email');
      } else
        if (user.password !== userData.password) {
          res.status(401).send('Invalid password')
        } else {
          let payload = { subject: user._id };
          let token = jwt.sign(payload, 'secretKey');
          res.status(200).send({ token });
        }
    }
  })
})

1 Ответ

0 голосов
/ 20 февраля 2020

Вы можете попробовать использовать промежуточное ПО для извлечения токена из заголовка авторизации и получения оттуда userId, промежуточное ПО может выглядеть примерно так:

const decodeToken = (token) => {
    return jwt.verify(token, 'secretKey', (err, decoded) => {
        if (err) {
            return undefined;
        }
        return decoded;
    });
};

const authorize = (req, res, next) => {
    if (!req.headers.authorization) {
        return res.status(401).send({message: 'UNAUTHORIZED'});
    }
    const token = req.headers.authorization.split(' ')[1];
    if (!token) {
        return res.status(401).send({message: 'UNAUTHORIZED'});
    }
    const decodedToken = decodeToken(token);
    if (!decodedToken) {
        return res.status(401).send({message: 'UNAUTHORIZED'});
    }
    req.userId = decodedToken.subject;
    next();
};

module.exports = authorize;

Надеюсь, это поможет вам, если нет, я надеюсь, что вы найдете свой ответ:)

РЕДАКТИРОВАТЬ

Чтобы использовать промежуточное ПО, вам нужно только добавить его в свой маршрут, я оставлю вам пример с get запрос:

const authorize = require('../middleware/authorize');

router.get('/someroute', authorize, (req, res) => {
  // authorize will verify the token and attach the userId to your request
  // so to use it you'll only need to call req.userId
  // something like this
  console.log('current logged user id', req.userId);

  // YOUR CODE HERE
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...