Как обновить токен при входе пользователя в экспресс js?

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

router.post("/login", (req, res, next) => {
  User.find({ email: req.body.email })
    .exec()
    .then(user => {
      if (user.length < 1) {
        return res.status(401).json({
          message: "Auth failed"
        });
      }
      bcrypt.compare(req.body.password, user[0].password, (err, result) => {
        if (err) {
          return res.status(401).json({
            message: "Auth failed"
          });
        }
        if (result) {
          const token2 = jwt.sign(
            {
              email: user[0].email,iat: Math.floor(Date.now() / 1000) - 30
            },
            "123",
            {
                expiresIn: "1h"
            }
          );
          User.update({token : token2 })
            .exec()

          return res.status(200).json({
            message: "Auth successful",
            token: token2
          });
        }
        res.status(401).json({
          message: "Auth failed"
        });
      });
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({
        error: err
      });
    });
});

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

Может кто-нибудь знает, где мне не хватает?

3 ответа

Решение

Попробуйте что-то вроде:

router.post("/login", async (req, res) => {
  try{
    const user = await User.find({ email: req.body.email });
    if (user.length < 1) {
      return res.status(401).json({
        message: "Auth failed"
      });
    }
    bcrypt.compare(req.body.password, user[0].password, (err, result) => {
      if (err) {
        return res.status(401).json({
          message: "Auth failed"
        });
      }
      if (result) {
        const token2 = jwt.sign(
          {
            email: user[0].email,iat: Math.floor(Date.now() / 1000) - 30
          },
          "123",
          {
            expiresIn: "1h"
          }
        );
        User.update({_id:user[0]._id},{$set:{token : token2 }},{new: true});

        return res.status(200).json({
          message: "Auth successful",
          token: token2
        });
      }
      res.status(401).json({
        message: "Auth failed"
      });
    });
  }
  catch(err){
    res.status(500).json({
      error: err
    });
  }
});

Попробуйте код ниже:

      jwt.sign(
        {
          email: user[0].email,iat: Math.floor(Date.now() / 1000) - 30
        },
        "123",
        {
            expiresIn: "1h"
        }, function(err, token2) {
           User.update({token : token2 }).exec() //Change the query to update

         return res.status(200).json({
            message: "Auth successful",
            token: token2
         });
       }
      );

Дайте мне знать, если это поможет.

Сначала поймите, зачем вам нужно обновлять токен. После создания токена вы можете сохранить этот токен как переменную сеанса в сети, во внутренней памяти вашего мобильного телефона и т. Д.

Вместо обновления токена вы можете создать другой токен. Другим способом вы можете установить тайм-аут для токена. Токен будет недействительным после этого периода времени.

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