【问题标题】:Implementation JWT based authentication without Oauth and custom token scheme实现基于 JWT 的身份验证,无需 Oauth 和自定义令牌方案
【发布时间】:2017-11-10 07:57:40
【问题描述】:

我正在开发一个基于 JWT 的身份验证的 Web API。我既没有使用 PasswordJS 中间件也没有使用 Oauth 协议。它基本上是我用来签名和验证令牌的 JWT npm。

token 的整个概念很清楚,但我对“token scheme”这个术语很困惑,无法理解它的用途。

我想了解的是:我是否需要使用某种排序或自定义的“JWT”方案并在将令牌发送回服务器以进行进一步请求时对其进行验证,或者这个概念仅由 Oauth 使用,以及我只需要发送普通令牌?

var accessToken = jwt.sign({
    userID: user.id,
    isAdmin: user.isAdmin
}, config.userSecret, {
    expiresIn: 600 
});

res.json({
    success: true,
    user: {
        id: user._id,
        name: user.name,
        username: user.username,
        accessToken: 'JWT ' + accessToken, 
    }
});


jwt.verify(accessToken, secret, function(err, token){...}); //throws error when token is passed with the custom scheme

【问题讨论】:

    标签: express authentication jwt


    【解决方案1】:

    在这种情况下,您使用的确切方案并不那么重要,因为无论如何您都在手动解析 Authorization 标头的内容。

    基本上,令牌通过名为Authorization 的HTTP 标头从客户端发送到服务器。在令牌前面放置方案的名称。所以 Authorization 标头可能看起来像这样:

    Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
    

    (允许的名称列表是 here。对于 JWT,它通常是 Bearer。根据 RFC6749,从技术上讲,您没有遵循 OAuth 2.0 承载方案,但无论如何它通常称为 Bearer。)

    您必须手动获取令牌 (ey...) 并使用 jwt.verify() 进行验证以获取其有效负载。

    const headerExists = req.headers.authorization
    
    if (headerExists) {
      let token = req.headers.authorization.split(' ')[1];
    
      jwt.verify(token, auth.secretjwtkey, function (err, decoded) {
        if (err) {
          res.status(HttpStatus.UNAUTHORIZED).json('Unauthorized');
        } else if (decoded.role === 'admin') {
          next();
        } else {
          res.status(HttpStatus.UNAUTHORIZED).json('Unauthorized');
        }
      })
    } else {
      res.status(HttpStatus.FORBIDDEN).json('No token');
    }
    

    您可以从上面的示例中间件中看到,我不关心 Authorization 标头上的 Bearer 字符串,只关心令牌本身。当然,您可以检查它是否真的是 Bearer 而不是别的东西。

    所以这个故事的寓意是:

    • 您在 Authorization 标头上将令牌从客户端发送到服务器。您必须设置前端才能做到这一点。
    • 您将 Bearer 放在令牌前面(或允许列表中的其他一个,但建议使用 Bearer)。
    • 您通过读取 Authorization 标头上的字符串的第二部分来解码令牌,然后将其提供给 jwt.verify()

    更多详情请见here

    【讨论】:

    • 非常感谢您的详细解释。说得好。
    猜你喜欢
    • 2017-03-10
    • 2011-03-18
    • 2020-08-23
    • 2015-06-30
    • 2016-09-21
    • 2016-06-01
    • 2018-05-10
    • 1970-01-01
    • 2019-08-19
    相关资源
    最近更新 更多