如何针对跨域的 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 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章