проверка токена jwt на главной странице

#node.js #reactjs #express #jwt

#node.js #reactjs #экспресс #jwt

Вопрос:

до того, как я начал работать с ReactJS, я использовал экспресс-сеансы (с ExpressJS, конечно), чтобы определить, был ли пользователь аутентифицирован или нет, мое промежуточное программное обеспечение передавалось в URL / profile следующим образом router.use('/profile', middleware, require('./profilePageFile')) , и если пользователь не был аутентифицирован, я перенаправлял на страницу входа с помощью простого кода

 if(!req.session.user){
  res.redirect('/login')
}
  

я пытался использовать перенаправление и с react, но поскольку react имеет собственную систему маршрутизации (react-router-dom), а express нужен только для создания API, когда я входил в систему / profile url, он все еще показывал мне содержимое страницы и перенаправлял меня через xxx миллисекунд позже, и я думаю, что было бы лучше, если бы у меня была страница моего профиля и главная страница по URL по умолчанию (‘domain.com /’ ), поскольку я вижу, что многие веб-сайты используют эту технику, включая Facebook, на данный момент я пытался сделать что-то вроде этого: если у пользователя нет токена или срок действия токена истек, не отображайте какую-либо кнопку «привет, пользователь», в противном случае отобразите ее. моя единственная проблема в том, что я не знаю, как это сделать.
если у меня в состоянии реакции есть логическое значение IsAuthenticated или что-то подобное, которое определяет, аутентифицирован пользователь или нет в соответствии с заголовком, который я отправляю со стороны сервера, я думаю, это было бы плохой практикой для безопасности, а также, когда я попробовал это, это все равно не сработало. на данный момент единственное, что я могу сделать, это передать req.userId клиенту, если токен существует. это работает, но этого недостаточно, если кто-нибудь понял, я буду рад, если мне помогут
вот мой код промежуточного программного обеспечения

 const guard = (req, res, next) => {
  const token =
    req.body.token ||
    req.query.token ||
    req.headers["x-access-token"] ||
    req.cookies.token;

  if (!token) {
    res.status(401).send({ auth: false });
  } else {
    jwt.verify(token, process.env.SECRET, function(err, decoded) {
      if (err) {
        return res.status(500).send({
          message: err.message
        });
      }

      req.userId = decoded.id;
      res.status(200).send({ auth: true });
      next();
    });
  }
};
  

Комментарии:

1. что я могу сделать вместо отправки {auth: false}?

2. О чем вы конкретно спрашиваете? Как написать промежуточное программное обеспечение для проверки JWT или как при необходимости отобразить компоненты в React?

3. в принципе да. как написать промежуточное программное обеспечение для проверки JWT

4. можете ли вы помочь мне с этим?

Ответ №1:

Я внес два изменения в ваш код.

 const guard = (req, res, next) => {
    const token = req.body.token ||
        req.query.token ||
        req.headers['x-access-token'] ||
        req.cookies.token;

    if (!token) {
        // Authentication failed: Token missing
        return res.status(401).send({ auth: false })
    }

    jwt.verify(token, process.env.SECRET, function (err, decoded) {
        if (err) {
            // Authentication failed: Token invalid
            return res.status(401).send({
                auth: false,
                message: err.message
            })
        }

        req.userId = decoded.id
        next()
    })
}
  

Во-первых, внутри if(err) условия я изменил код состояния на 401 , потому что, если токен недействителен, это вызовет ошибку здесь.

Во-вторых, я удалил res.status(200).send({auth:true}) из нижней части функции. Это потому, что промежуточное программное обеспечение должно перейти к маршруту (который мы пытаемся защитить с помощью проверки JWT), чтобы ответить. Это был ответ на запрос до того, как он попал на фактический маршрут.

Комментарии:

1. к сожалению, вы не поняли мою точку зрения. я попробую что-нибудь, и если у меня не получится, я объясню свою проблему более подробно

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

3. можем ли мы поговорить в чате? потому что здесь сложно объяснить

4. о, больше не беспокойтесь об этом, я решил проблему, (я думаю)