【发布时间】:2018-03-22 00:14:06
【问题描述】:
我正在开发一个项目,它是一个单页动态 Web 应用程序,它使用 Javascript 和 Websocket 从 Golang 服务器检索数据。我已经实现了this article 中描述的自动授权方法。我是从this one 提到的那篇文章,最后提到要查看我链接的第一篇文章(以防你想知道第一篇文章是在“改进”什么)。
这是我的设置的工作方式:
- 客户端加载应用程序,在任何动态加载之前,客户端连接到 Websocket
- 客户端通过 Websocket 从 localStorage 发送登录、设备令牌和会话令牌(当然如果他们之前登录过)
- Golang Websocket 服务器检查数据库是否有匹配的登录名、设备令牌、会话令牌、客户端的浏览器/版本等(我获取了一些其他数据来匹配设备与用户的 HTTP 请求以提高安全性)
- 如果有匹配,Golang 会生成一个新的会话令牌,用它更新数据库匹配,并将其发送回客户端
- 客户端获取会话令牌并在其 localStorage 中更新它以在下次加载站点时使用
现在,不要误会我的意思。一切都很好...但是有一个问题:
如果用户登录,然后尽可能快地重新加载页面,有时 websocket 和服务器没有足够的时间将用户的下一个会话令牌返回给他们。这当然会导致他们的令牌过期并从数据库中删除,并通知用户他们的凭据已过期或被盗(从业务角度来看,这确实看起来不太好)。
我对解决方案有一些想法,但从长远来看,似乎没有一个在可扩展性方面很有希望。
感谢您对此事的所有想法和解决方案!
【问题讨论】:
-
登录后会话就建立了,不是吗?为什么要在会话仍处于活动状态时重新生成记住我的令牌?在会话过期时不活动一段时间后,您只会这样做一次。所以你应该冒险错过一次记住我的更新。
-
另外,使用浏览器指纹进行身份验证是有问题的。我不想在浏览器更新后退出(我的浏览器版本现在与您的数据库条目不同)。最好对令牌进行加密签名,例如使用 hmac。
-
我不知道这是否有帮助,但 websocket 握手支持 cookie。您可以在不使用本地存储的情况下实现文档中描述的方案。
-
@Peter 你知道,我忘了会话......这是个好主意。关于浏览器指纹,我不使用版本号。只是在机器/浏览器上保持持久性的东西的组合,我可以通过他们对 websocket 的 HTTP 请求获得。您应该发布使用会话的答案,以避免多次尝试自动登录!
-
@CeriseLimón 我不想使用 cookie,因为它们过期了。
标签: javascript go websocket server authorization