【问题标题】:Check auth with JWT (nodeJS)使用 JWT (nodeJS) 检查身份验证
【发布时间】:2023-04-06 16:06:01
【问题描述】:

我想通过添加中间件“checkAuth”来保护我的路由。 此中间件检查 jwt 令牌的有效性。 我正在使用 Express 路由器。

但我不明白该怎么做。

我的 checkAuth 中间件:

module.exports = (req, res, next) => {
    let token = req.headers.authorization.split(" ")[1];

    try {
        jwt.verify(token)
        console.log("ok")
    }catch (e) {
        res.status(403)
    }

    next();
}

谢谢!

【问题讨论】:

  • console.log(e) 在你的捕获中你得到了什么?
  • console.log(e) 给了我“位置 17 处 JSON 中的意外标记”

标签: javascript node.js express jwt


【解决方案1】:

假设您使用的是jsonwebtoken,则您缺少“秘密”字符串。

根据文档,您应该这样做。

  1. 创建令牌时:

    var jwt = require('jsonwebtoken');
    var token = jwt.sign({ foo: 'bar' }, 'shhhhh');
    

    你也可以通过过期时间:

    jwt.sign({
      data: 'foobar'
    }, 'secret', { expiresIn: 60 * 60 });
    
  2. 用于验证:

    有几种方法可以做到。 但是您应该需要相同的密码字符串来验证您用于登录的密码。 您还需要为 jwt.verify 分配一个变量或使用回调调用它,以便访问解码后的数据,例如用户 ID 等。

    // verify a token symmetric - synchronous
    var decoded = jwt.verify(token, 'shhhhh');
    console.log(decoded.foo) // bar
    
    // verify a token symmetric
    jwt.verify(token, 'shhhhh', function(err, decoded) {
      console.log(decoded.foo) // bar
    });
    
    // invalid token - synchronous
    try {
      var decoded = jwt.verify(token, 'wrong-secret');
    } catch(err) {
      // err
    }
    
    // invalid token
    jwt.verify(token, 'wrong-secret', function(err, decoded) {
      // err
      // decoded undefined
    });
    

【讨论】:

    【解决方案2】:

    创建一个名为“verifyToken”的新函数

    我建议答应它。因此,您可以在 async 函数中结合使用 await

    function verifyToken(token){
      return new Promise((res, err) => {
        jwt.verify(token, "secret key", (err) => {
          if (err) rej(err)
          res(true)
        })
      })
    }
    

    它基于承诺。现在您只需将令牌传递给它解析为真或假的函数:

    module.exports = async (req, res, next) => {
        let token = req.headers.authorization.split(" ")[1];
        try {
            await verifyToken(token);
            console.log("ok")
        }catch (e) {
            res.status(403)
        }
    
        next();
    }
    

    【讨论】:

    • 这也有效,谢谢!
    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多