使用localStorage和Websocket进行自动授权

时间:2018-03-22 00:14:06

标签: javascript go websocket server authorization

我正在开发一个项目,它是一个单页动态Web应用程序,它使用Javascript和Websocket从Golang服务器检索数据。我已经实现了this article中描述的自动授权方法。我被引用来自this one的那篇文章,最后提到要查看我链接的第一篇文章(以防万一你想知道第一篇文章是什么“改进”)。

这就是我的设置:

  • 客户端加载app,在任何动态加载之前,客户端连接到Websocket
  • 客户端从localStorage通过Websocket发送登录,设备令牌和会话令牌(当然,如果他们之前已登录)
  • Golang Websocket服务器检查数据库是否具有匹配的登录名,设备令牌,会话令牌,客户端的浏览器/版本等(我获得了一些其他数据以匹配具有用户HTTP请求的设备以获得额外的安全性)
  • 如果匹配,Golang会生成一个新的会话令牌,用它更新数据库匹配,并将其发送回客户端
  • 客户端获取会话令牌并在localStorage中更新它以在下次加载站点时使用

现在,不要误会我的意思。一切都很好......但是一个问题

如果用户登录,则尽可能快地重新加载页面,有时websocket和服务器没有足够的时间将用户的下一个会话令牌返回给他们。这当然会导致其令牌过期并从数据库中删除,并通知用户他们的凭据已过期或被盗(从商业角度来看,这看起来并不好看。)

我对解决方案有一些想法,但从可扩展性和长期来看,似乎没有一点看好。

对此事的所有想法和解决方案表示赞赏!

1 个答案:

答案 0 :(得分:1)

登录后,您应该向浏览器发送两个令牌,一个短暂的会话令牌(比如一小时)和一个长期记住我的令牌(比如说30天)。每次浏览器显示活动时,会话令牌的TTL都会重置为一小时,但其值不会改变。

当且仅当会话cookie已过期(或其他方式无效)时,记住我的cookie将被交换一个新的,经过身份验证的会话。重新加载页面时,只有在浏览器处于非活动状态超过一小时后才会发生这种情况。

延长会话完全在服务器端进行。只有在交易remember-me令牌时,浏览器才能接收并存储新的会话令牌。

首次使用后,不应立即从数据库中删除remember-me标记。如果我启动浏览器,则会恢复以前打开的标签页,其中可能包含多个网站标签。因此,您的服务器几乎会同时接收多个请求(或websocket连接),并且这些请求将竞争新的会话令牌。

在我的工作场所,我们允许记住我的代币在首次使用后最多使用两分钟,最多N次,以先发生者为准。这可以修复比赛并允许在连接问题时重试。