我正在使用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?
答案 0 :(得分:1)
您需要根据您的安全需要使用。
例如,对于我的应用程序,我会按照您的示例进行操作。令牌存储在客户端cookie中,在身份验证中,我做了一件事:
可以在API调用中公开相同的用户信息。需要注意的一件重要事情是我的系统不需要总是更新和同步。因此,我的客户端用户只会在登录时和特定的GET请求中获取用户数据。
您不需要在JWT中混入大量垃圾。它需要解码。