我正在开发一个项目,它是一个单页动态Web应用程序,它使用Javascript和Websocket从Golang服务器检索数据。我已经实现了this article中描述的自动授权方法。我被引用来自this one的那篇文章,最后提到要查看我链接的第一篇文章(以防万一你想知道第一篇文章是什么“改进”)。
这就是我的设置:
现在,不要误会我的意思。一切都很好......但是一个问题:
如果用户登录,则尽可能快地重新加载页面,有时websocket和服务器没有足够的时间将用户的下一个会话令牌返回给他们。这当然会导致其令牌过期并从数据库中删除,并通知用户他们的凭据已过期或被盗(从商业角度来看,这看起来并不好看。)
我对解决方案有一些想法,但从可扩展性和长期来看,似乎没有一点看好。
对此事的所有想法和解决方案表示赞赏!
答案 0 :(得分:1)
登录后,您应该向浏览器发送两个令牌,一个短暂的会话令牌(比如一小时)和一个长期记住我的令牌(比如说30天)。每次浏览器显示活动时,会话令牌的TTL都会重置为一小时,但其值不会改变。
当且仅当会话cookie已过期(或其他方式无效)时,记住我的cookie将被交换一个新的,经过身份验证的会话。重新加载页面时,只有在浏览器处于非活动状态超过一小时后才会发生这种情况。
延长会话完全在服务器端进行。只有在交易remember-me令牌时,浏览器才能接收并存储新的会话令牌。
首次使用后,不应立即从数据库中删除remember-me标记。如果我启动浏览器,则会恢复以前打开的标签页,其中可能包含多个网站标签。因此,您的服务器几乎会同时接收多个请求(或websocket连接),并且这些请求将竞争新的会话令牌。
在我的工作场所,我们允许记住我的代币在首次使用后最多使用两分钟,最多N次,以先发生者为准。这可以修复比赛并允许在连接问题时重试。