我正在为个人项目创建一个API和一个SPA,并在以下验证用户的解决方案之间犹豫不决(注意:通过HTTPS):
我甚至不认为OAuth,因为这似乎是一个真正的痛苦,而且我不需要认证其他应用程序,我只关心认证用户。
据我所读,JWT似乎是一个日益增长的标准。它基本上保存调用方的数据,所以每次调用者发出API请求时,您都会使用encrypt(base64(header) + "." + base64(payload))与secret进行比较,并将其与令牌本身最后部分中提供的签名进行比较。它避免了执行DB事务。
问题是,如果我使用JWT 1),我没有可能手动撤销特定的令牌,最重要的是,如果我更改用户的权限,最重要的是,如果更改用户的权限,以前授予的JWT将仍然拥有旧的数据,而旧的权限可以授予/限制他对某些数据的持续访问,只要他没有获得新的权限,这确实是有问题的,而且我很惊讶我还没有看到有人提到这个问题。此外,3) JWT声称允许服务器在不访问DB的情况下验证访问,但我无法想象任何不涉及数据库的请求,如果只是返回用户请求的数据的话。所以这个论点对我来说没有任何意义。
对我来说,我现在最好的选择是选项2。网站将有限制和小流量,所以在数据库中存储令牌似乎是一个小而有价值的权衡,允许我用这些令牌做任何我想做的事情,包括管理它们的生命周期和权限。它还避免像选项1那样公开用户的凭据,以防他们在其他在线服务中使用相同的凭据。
我只想知道我对JWT的担忧是正确的,还是我误解了它的功能?而且,即使我已经读过很多关于这些不同选项的文章,也可以自由地链接任何能照亮我的东西,帮助我做出更好的选择。谢谢。
发布于 2016-08-16 06:50:33
您是对的,在过期之前使令牌无效是一个常见的JWT问题。有几个原因需要考虑:帐户删除/阻止/暂停、密码更改、权限更改、管理员注销用户。
使用JWT,您还可以设置一个令牌黑名单来存储在注销和过期时间之间的令牌,标记过期并在每个请求中检查它。您可以只包含ID (JWT的jti声明),或者使用最后的登录日期和iat声明(在
当用户更改密码/权限时,其他使令牌无效的技术是使用这些字段的散列对令牌进行签名。如果字段值发生变化,任何以前的标记都会自动失败验证。
请参阅https://stackoverflow.com/a/37520125/6371459
最后,请注意令牌是用服务器私钥(未加密)签名的。
sign(base64(header) + "." + base64(payload))https://stackoverflow.com/questions/38940671
复制相似问题