用户在express js中登录时如何更新令牌?

Posted

技术标签:

【中文标题】用户在express js中登录时如何更新令牌?【英文标题】:How to update token when the user logs in in express js? 【发布时间】:2019-03-03 00:13:54 【问题描述】:

我想在用户登录时更新用户集合中的令牌。到目前为止,我已经尝试过了。

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
      );
    );
);

这里正在生成新令牌,但它没有保存在用户集合中。我想更新集合中的新令牌。

谁能知道我在哪里失踪?

【问题讨论】:

我可以知道你的MongoDB 版本吗? 我认为您的更新是在执行jwt.sign 之前发生的。看看你能不能得到jwt.sign的任何回调。 【参考方案1】:

试试类似的东西:

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
    );
  
);

【讨论】:

从 find 中删除 .exec() 也是因为在使用时我们不需要 .exec() 来执行查询。 然后你必须在用于 find 的 then 之外运行更新查询。最好使用 async 和 await。【参考方案2】:

试试下面的代码:

      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
         );
       
      );

如果有帮助,请告诉我。

【讨论】:

现在令牌没有被打印,只有验证成功被打印 你能不能放一个控制台检查一下token2的值? @BhaktiThakkar【参考方案3】:

首先了解为什么需要刷新令牌。创建令牌后,您可以将该令牌作为会话变量存储在网络、移动设备的内部存储等中......

您可以创建另一个令牌,而不是刷新令牌。 以另一种方式,您可以为令牌设置超时。令牌将在该时间段后失效。

【讨论】:

以上是关于用户在express js中登录时如何更新令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JWT 令牌显示当前登录用户的用户名

当用户在nodeJS / Express和Angular中空闲一段时间(基于令牌的授权)时,我如何使我的JWT令牌过期

在 Express.js 中刷新 JWT

如何安全地保存从 auth0 登录收到的 JWT 令牌(nodejs express)

如何设置cookies express、react.js

如何使用 express 在用户浏览器的响应标头 cookie 中查找 JSON Web 令牌 (JWT) 来制作 node.js?