JWT有效载荷应该有多少信息?

时间:2015-10-29 16:43:36

标签: node.js mean-stack jwt

我正在使用Mean堆栈构建一个flashcard应用程序,并试图模仿本教程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请求时,都必须发送令牌   授权标题。

     

根据您在该令牌中存储的信息量,它可以   变大。另一方面,会话cookie通常只是一个   标识符(connect.sid,PHPSESSID等)和其他内容   生活在服务器上(如果你只有一台服务器,那就在内存中)   数据库(如果在服务器场上运行)。

     

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

我试图从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()})
  });
});

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

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

    return res.json({token: user.generateJWT(), 
                     user: user})
  });

或者是否应将所有额外的用户信息放入JWT并且只传回JWT?

1 个答案:

答案 0 :(得分:1)

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

例如,对于我的应用程序,我会按照您的示例进行操作。令牌存储在客户端cookie中,在身份验证中,我做了一件事:

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

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

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