我有一个不使用刷新令牌的身份验证系统解决方案。请告诉我这种方法的漏洞在哪里。
我假设如下:
- 客户端和服务器位于同一域中
- 客户端是一个支持HttpOnly cookie的浏览器
- 客户端正在使用单页应用程序
步骤为:
- 用户通过使用凭据向
/api/auth
发出请求来登录 - 服务器对用户进行身份验证,并使用包含JWT的HttpOnlyCookie发回设置Cookie标头
- 客户端接收并设置HttpOnly cookie。客户端还在本地存储中设置了一个变量
logged: true
- 过了一段时间,用户重新打开浏览器。单页应用程序检查本地存储中的变量
logged
是否为== true
。如果是,请通过向/api/check-cookie
发出请求来检查它是否仍然具有HttpOnly cookie - 如果服务器找到HttpOnly cookie并且它是有效的,则服务器将使用
true
进行响应。否则为false
- 如果客户端从
/api/check-cookie
接收到false
,则会提示用户登录
使用这种方法,JWT可能有很长的到期日期,并且不需要跟踪刷新令牌。
我是不是错过了什么?
我喜欢你的想法,也有类似的想法,特别是设置一个本地存储变量来反映登录状态,这样我就可以在进行毫无意义的服务器调用以刷新可能不存在的令牌之前检查一下,但我仍在使用刷新令牌。
我相信问题的关键在于,当用户在服务器端进行更新时,它不会反映在客户端,直到用户使用新的长期单一令牌重新进行身份验证,而不是当短期访问令牌刷新时,使用更新的数据再次设置用户。