【问题标题】:Is it possible to add HTTP headers to a Socket.io handshake?是否可以将 HTTP 标头添加到 Socket.io 握手?
【发布时间】:2011-09-27 16:18:43
【问题描述】:

我正在尝试保护我的 socket.io 客户端和 node.js 端之间的通道。主 Web 应用程序位于 Drupal 中,因此如果 node.js 在另一台主机上,我无法将 cookie 传递给 node.js。我想为他的 Socket.io HTTP 握手(如 PHP 会话)添加一些自定义标头。 你知道这是否可能吗? 使用 Socket.io 0.7

【问题讨论】:

    标签: session authentication node.js socket.io


    【解决方案1】:

    P.S:我只是在这里稍微集思广益。我喜欢这个问题,并且会对此进行更多思考。我只是从 node.js 相同的域才想到它...

    Github 问题

    我不知道(不这么认为)是否可以添加标题。 P.S:我认为您也应该尝试在https://github.com/LearnBoost/socket.io/issues 填写问题。 github 的好处是,当有人发布问题时,作者会收到一封电子邮件。此外,learnboost 的人都是非常好的人,他们愿意帮助您。

    代理

    代理您的所有请求,以便请求来自同一个域。

    推荐人

    refererer 已传递,因此您可以从中传递信息。这也可能被欺骗,因此您最好创建一些可以从 Drupal 验证(仅一次)的东西。我想这很容易实现......

    只允许验证后的消息流。

    我知道你可以通过socket.disconnect() 断开套接字。打开连接并检索 socket.io 的 id,但仅在身份被批准后才接受消息。我将通过 express 提供一条路线,Drupal 可以将post socket.io 的 id 卷曲到(保持路线私有)。因为您在 Drupal 的域中,所以您可以访问 Drupal 的会话信息。

    // v0.7.x
    var sid = socket.id;
    

    要确保此安全,唯一的选择是使用 SSL(无论如何,这是确保任何通信链接安全的唯一方法)。如果您信任这两个域的 SSL,则可能不是真的需要。然后,如果允许 socket.io 的 id,您将允许消息流,否则我将断开连接。

    PusherApp

    另一种选择是实现/克隆 pusherapp 身份验证 => http://pusher.com/docs/client_api_guide/client_channels#subscribe-private-channels

    P.S:稍后我会尝试上传一个示例,但现在该睡觉了。希望这有任何意义:)...

    【讨论】:

    • 正如我所说,问题在于 Drupal 和 Node.js 服务器不在同一主机上。 Drupal 页面中的 socket.io 逻辑,因此 Drupal cookie 不会传递到 Node.js 所在的主机。 (我在另一个线程上赞成你的答案,并偷走了 parse_cookie 助手:))
    • @claudio 你是对的:$。我错过了另一个主机部分,因此不共享会话/cookie:$。我想我知道你想要什么,但不是通过添加标题。请等待几分钟让我尝试一下并更新我的答案...
    • 非常感谢您的头脑风暴(我也经常这样做)!另一件要考虑的事情是,如果 cookie 不是 主机特定,那么问题似乎就没有那么严重了:我可以将“www.myserver.com”用于 Web,而“node.myserver”则用于.com" 用于 socket.io 端点。 TCP 端口似乎不是问题。
    • 我看到你向 github 添加了问题。希望吉列尔莫能想出一个干净的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 2018-09-05
    • 1970-01-01
    • 2012-11-06
    • 2012-08-14
    • 2017-10-15
    • 2012-01-04
    相关资源
    最近更新 更多