如何针对跨域的 PHP 会话 ID 对 Socket.IO 进行身份验证

Posted

技术标签:

【中文标题】如何针对跨域的 PHP 会话 ID 对 Socket.IO 进行身份验证【英文标题】:How to authenticate Socket.IO against PHP session id across domains 【发布时间】:2011-12-20 18:03:07 【问题描述】:

我在 node.mydomain.com 上有一个 node/Socket.IO 设置,在 www.mydomain.com 上有一个 Apache/php 堆栈。

目前我正在使用类似这样的方式进行身份验证:

    客户端:在连接时,发送一个自定义的authorization 事件,其中包括 PHPSESSID 到服务器 服务器:在authorization上,使用此cookie调用api.php获取用户信息,向客户端发送此身份信息 客户:现在可以使用此身份执行操作

这有点笨拙,因为 Socket.IO 有一个我想使用的身份验证位置 (On this wiki)。问题是我不知道如何将 PHPSESSID cookie 信息从客户端发送到服务器。它们位于不同的域中,因此浏览器不会将它们包含在请求中。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我建议切换会话处理并改用 Redis,这也比基于默认文件的会话处理更快。

首先安装Redis server。之后,通过首先编译它然后配置您的 php.ini 以使用它,将 the phpredis extension 添加到 PHP。

extension=redis.so
session.save_handler = redis
session.save_path = "tcp://localhost:6379/"

然后您可以从 Node.js 中使用 node_redis 模块读取这些会话。

【讨论】:

这正是我正在做的。但请记住,您应该始终通过 https 将会话 id 发送到节点实例!

以上是关于如何针对跨域的 PHP 会话 ID 对 Socket.IO 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何构建非跨域的 AJAX API?

跨域 cookie 访问(或会话)

聊一聊实现Session跨域的问题

如何解决跨域问题

解决ajax跨域的办法,代理,cors,jsonp

解决Geoserver请求跨域的几种思路