如何在node中共享Laravel会话?

9
我正在设置一个socket.io服务器来处理socket请求,它运行在1234端口。这个服务器与一个laravel5.1应用程序并行运行,Laravel使用redis来处理会话。
我有很多关于将Laravel与socket.io连接的教程,都相当简单明了。我可以连接、响应并将消息传递回socket并到达Laravel应用。
然而,每个教程都避免了此设置中的身份验证部分。一旦socket:1234空间内接收到消息,如何将该消息转发到Laravel,同时确保该请求被登录认证。
理想情况下,我只需共享会话,并验证XSRF令牌。由于两个应用程序位于不同的端口上,我无法直接获取会话。
目前,我正在使用替代方法,它包括以下步骤:
- 在socket连接(在node中)时,我使用node的Crypto库和node的PHPUnserialise库解密连接时发送的cookie。 - 这使我得到了来自cookie的laravel会话id。 - 我使用这个ID来访问redis laravel session。 - 然后我解密该会话,从而得到对用户ID的访问权限。
虽然这个方法可行,但我觉得它可能是一个安全漏洞,因为我实际上没有使用_token来验证来源。

你尝试使用第三方软件来解决问题了吗?例如MQ。它看起来符合你的所有需求。 - Ostin
2个回答

7
我认为你的代码是正确的,也可能是唯一的方法。 session_id通常存储在cookie中,并且在某个时刻必须发送到服务器。由于node和php是不同的语言,它们不能直接共享会话。您始终需要一个中间存储,例如redis、mysql或文件系统。当然还需要一种检索会话的方式。检索会话的关键是session_id。
有关保护websockets的有趣文章:

https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html

他建议的是在会话中添加一个随机生成的密钥,在建立WebSocket连接时可以进行验证。会话ID本身已经是随机的,但这些会话ID通常具有长期性,因此短期的随机ID可以增加安全性。短暂的时间应该尽可能短:让PHP将其添加到数据库中,并在节点中验证连接后从数据库中删除,以便您无法再次使用它。
还有许多其他的会话验证技术,比如检查浏览器字符串,或将会话固定到一个IP地址上:

http://phpsec.org/projects/guide/4.html

我不建议使用这些检查,因为它们并没有增加额外的安全性,只会给最终用户带来烦恼。
最重要的是:
  • 您需要使用安全的通信方式来传递session_id等信息。这意味着使用HTTPS。
  • 会话应在用户关闭浏览器时过期。
  • 如果用户从不同的位置连接,则应通知用户,或者用户应该访问其“登录日志”。

1
我大约一年前找到了一个不错的解决方案。我决定将其制作成一个模块,使用起来非常简单。它可以帮助你获取cookie而无需硬编码,还可以帮助你获取session ID并从mysql和redis中检索它。

https://www.npmjs.com/package/node-laravel-session


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接