JWT 负载中应该包含多少信息?

DC3*_*314 5 node.js jwt mean-stack

我正在使用 Mean 堆栈构建一个抽认卡应用程序,并尝试模仿本教程https://thinkster.io/mean-stack-tutorial#wiring-everything-up中遵循的过程。

当新用户注册时,我想在用户对象中返回该用户的信息:正在研究的当前和最近的抽认卡,正在研究的当前和最近的卡片等。

我的问题是这些信息中有多少应该进入 JWT 有效负载?

在 thinkster.io 教程中,JWT 的负载仅包含 user_ID、用户名和到期日期。我担心额外的信息是否不应该进入 JWT,因为它会使 JWT 变得太大。那么我是否只是将 JWT 与用户对象一起发回,该对象在使用 mongoose.save 方法保存用户后返回?这个策略听起来很像以下引述:

https://auth0.com/blog/2014/01/27/ten-things-you-should-know-about-tokens-and-cookies/#token-size

每次发出 API 请求时,您都必须在 Authorization 标头中发送令牌。

根据您在该令牌中存储的信息量,它可能会变大。另一方面,会话 cookie 通常只是一个标识符(connect.sid、PHPSESSID 等),其余内容位于服务器上(如果您只有一台服务器,则在内存中;如果您在服务器上运行,则为数据库)农场)。

现在,没有什么可以阻止您使用令牌实现类似的机制。令牌将包含所需的基本信息,并且在服务器端,您可以在每个 API 调用中使用更多数据来丰富它。这与 cookie 的作用完全相同,不同之处在于您有额外的好处,即现在这是一个有意识的决定,您拥有完全的控制权,并且是您代码的一部分。

我试图从 thinkster.io 模仿的 /register 路由代码如下:

router.post('/register', function(req, res, next){
  if(!req.body.username || !req.body.password){
    return res.status(400).json({message: 'Please fill out all fields'});
  }

  var user = new User();

  user.username = req.body.username;

  user.setPassword(req.body.password)

  user.save(function (err){
    if(err){ return next(err); }

    return res.json({token: user.generateJWT()})
  });
});
Run Code Online (Sandbox Code Playgroud)

我可以编辑底部的保存方法部分,使其看起来像这样:

user.save(function (err, user){
    if(err){ return next(err); }

    return res.json({token: user.generateJWT(), 
                     user: user})
  });
Run Code Online (Sandbox Code Playgroud)

还是应该将所有额外的用户信息都放入 JWT 中,而只有 JWT 被传回?

Rod*_*tou 1

您需要根据您的安全需要来使用。

例如,对于我的应用程序,我确实遵循您的示例。令牌存储在客户端 cookie 中,在身份验证中,我做了一件事:

  • 解码 JWT 并使用 _id 和另一个主键填充 request.user。
  • 发回令牌和用户信息。

相同的用户信息可以在 API 调用中公开。需要注意的一件重要的事情是我的系统不需要总是更新和同步。因此,我的客户端用户只会在登录时和特定的 GET 请求时获取用户数据。

您不需要在 JWT 中混合大量垃圾。它还需要解码。