尝试使用JWT为一个API实现安全的身份验证方法,这个API将被许多客户端使用,包括web(单页面应用程序),桌面,移动设备我已经想出了这个系统:
-
客户端调用/ auth / login,设置了用户名和密码
-
验证服务器返回两个令牌后,即auth_token和refresh_token
-
Auth令牌短暂存在15分钟,用于以后的每个API调用
-
刷新令牌长寿可能是12小时到一周但是用一个密钥以user_pass long_string格式签名
-
令牌过期后,将调用一个名为/ auth / renew的调用
-
发送身份验证令牌以检查其过期时间(不超过一小时)
-
也会发送刷新令牌,并使用用户密码进行验证
-
如果刷新令牌长时间没有过期,则会返回新的身份验证令牌
-
如果用户的密码已更改,则刷新令牌无效,并且用户需要在其现有的短期身份验证令牌过期后重新进行身份验证
虽然有一个小窗口让auth令牌过期但仍然有效,并且调用了数据库;这是使用JWT进行身份验证并处理密码更改和令牌刷新的整体安全方式吗?
1 回答
不要尝试实现自己的身份验证基础结构 . 您将获得安全实施的机会很小,现在您还必须维护所有代码 .
更好地使用来自信誉良好的来源的授权服务器,如Thinktecture IdentityServer或Azure Active Directory,并使用标准库和协议 .
我在您的提案中看到的一些问题:
如果您没有签署访问令牌,是什么阻止我更改内部声明?
如果您需要用户密码来验证刷新令牌,则必须以能够以明文形式检索它的方式存储它 . 密码只应存储为盐渍哈希,以防止您访问明文 .