我正在用Mean堆栈构建一个闪卡应用程序,并试图模仿本教程中遵循的过程https://thinkster.io/mean-stack-tutorial#wiring-一切就绪。
当一个新用户注册时,我想在用户对象中返回该用户的信息:正在研究的当前和最近一副抽认卡,正在研究的最新和当前卡片,等等
我的问题是,这些信息中有多少应该进入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-尺寸
每次发出API请求时,都必须在授权标头。
根据您在该令牌中存储的信息量,它可能做大。另一方面,会话cookie通常只是标识符(connect.sid、PHPSSID等)和其余内容存在于服务器上(如果您只有一个服务器或数据库(如果在服务器场上运行)。
现在,没有什么可以阻止您使用代币。令牌将具有所需的基本信息在服务器端,您可以在每个API调用上使用更多数据来丰富它。这与cookie的作用完全相同,不同之处在于你还有一个额外的好处,那就是这是一个有意识的决定,您可以完全控制,并且是代码的一部分。
我试图从thingster.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中,在身份验证中,我做一件事:
- 解码JWT并用_id和另一个主键填充request.user
- 发回令牌和用户信息
相同的用户信息可以在API调用中公开。需要注意的一件重要事情是,我的系统不需要总是更新和同步。因此,我的客户端用户只会在登录时根据特定的GET请求获取用户数据。
你不需要在JWT里混很多垃圾。它还需要解码。