【问题标题】:Auto Authorization using localStorage and Websocket使用 localStorage 和 Websocket 进行自动授权
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 好的,让我直截了当地说...您打开浏览器,其中打开了我网站的 3 个标签。他们都使用相同的凭据同时发送对新会话令牌的请求,并且他们都返回不同的新会话令牌?你不需要某种同步来确保你的浏览器接收并存储了最后一个创建的令牌,而 websocket 服务器只存储最后一个相同的令牌吗?
  • @newplayer65,您每次都会使用相同的会话令牌进行响应。当第一个请求进来时,您可以将它与记住我的令牌一起存储。大多数存储后端提供原子更新,否则您必须自己同步(在服务器上)。
猜你喜欢
  • 1970-01-01
  • 2020-10-23
  • 2021-06-05
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2010-10-30
相关资源
最近更新 更多