【问题标题】:How to share Laravel session with node?如何与节点共享 Laravel 会话?
【发布时间】:2015-12-08 22:19:56
【问题描述】:

我正在设置一个 socket.io 服务器来处理套接字请求。它在端口 1234 上运行。它与 laravel 5.1 应用程序一起运行。 Laravel 使用 redis 来处理会话。

我有很多关于将 laravel 与 socket.io 连接起来的教程,这一切都很简单。我可以连接、响应并将消息转发回套接字和 laravel 应用程序。

但是,每个教程都避免了此设置的身份验证部分。在 socket:1234 空间内收到消息后,如何在确保请求已通过身份验证的同时将该消息转发到 laravel。

理想情况下,我会简单地共享会话,并验证 XSRF 令牌。因为这两个应用程序在不同的端口上,所以我无法直接接听会话。

目前我正在使用另一种方法,它涉及以下内容:

  • 在套接字连接时(在节点中),我使用节点的 Crypto 库和节点的 PHPUnserialise 库解密连接时发送的 cookie。
  • 这给了我 laravel 会话 ID(来自 cookie)
  • 我用它来访问 redis laravel 会话
  • 然后我解密该会话,这反过来又使我能够访问用户 ID

它有效,但我觉得它可能是一个安全漏洞,因为我实际上并没有使用 _token 来验证来源。

【问题讨论】:

  • 您是否尝试使用 3-rd 方软件解决问题?以 MQ 为例。看起来它满足您的所有需求。

标签: php laravel laravel-5.1


【解决方案1】:

大约一年前,我找到了一个很好的解决方案。我决定把它做成一个模块,它真的很容易使用。无需硬编码即可帮助您获取 cookie。帮助您获取该会话 ID 并从 mysql 和 redis 中检索它

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

【讨论】:

    【解决方案2】:

    我认为您的代码是正确的,也许是唯一的方法。 session_id 通常存储在 cookie 中,并且在某些时候必须发送到服务器。由于 node 和 php 是不同的语言,它们不能直接共享会话。你总是需要像 redis、mysql 或文件系统这样的中间存储。当然还有一种检索会话的方法。检索会话的关键当然是 session_id。

    一篇关于保护 websockets 的有趣帖子:

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

    他的建议是为您的会话添加一个随机生成的密钥,您可以在建立 websocket 连接时进行验证。

    session_id 本身已经是随机的,但这些 session_id 通常是长期存在的,因此短期随机 id 可以提高安全性。 short-lived 应该尽量短:让php添加到数据库中,一旦在node中验证了连接,就将其从数据库中删除,这样就不能再使用了。

    还有很多额外的会话验证技术,比如检查浏览器字符串,或者将会话固定到一个 IP 地址:

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

    我不会推荐这些类型的检查,因为它们并没有真正增加额外的安全性,只会让最终用户感到烦恼。

    我认为最重要的是:

    • 您使用安全的方式来传递 session_id 等。这意味着 HTTPS
    • 会话应在用户关闭浏览器时过期
    • 如果用户从其他位置连接,则应通知用户,或者应有权访问他的“登录日志”

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 1970-01-01
      • 2016-12-29
      • 2014-01-24
      • 2018-05-18
      • 2013-09-27
      • 1970-01-01
      • 2015-08-28
      • 2020-01-15
      相关资源
      最近更新 更多