JWT有效载荷中应该包含多less信息?

我正在使用Mean stack构build一个flashcard应用程序,并试图模仿本教程中的过程https://thinkster.io/mean-stack-tutorial#wiring-everything-up 。

当新用户注册时,我想将用户的信息返回给用户对象:正在研究的当前和最近的一组卡片,当前和最近的卡片正在研究等等。

我的问题是这些信息中有多less应该joinJWT有效负载?

在thinkster.io教程中,JWT的负载仅包含user_ID,用户名和到期date。 我担心,如果额外的信息不应该进入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调用的更多数据来丰富它。 这与Cookie的function完全相同,不同之处在于您有额外的好处,现在这是一个有意识的决定,您拥有完全的控制权,并且是您的代码的一部分。

我试图从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才会被传回?

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

例如,对于我的应用程序,我遵循你的例子。 令牌存储在客户端cookie中,在validation内,我做了一件事:

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

在API调用中可以显示相同的用户信息。 需要注意的一点是我的系统不需要经常更新和同步。 所以,我的客户端用户只能在login时获取用户数据,并且在特定的GET请求中。

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