从PHP Ratchet WebSocket服务器获取客户端Cookies

3
我有一个 PHP Ratchet WebSocket 服务器,它在我的网站上运行一个自定义聊天室。
当用户连接到服务器时,我想获取他们的 cookies,以便可以获取其会话数据并在其登录/具有特定权限等情况下执行特殊操作。
在其他帖子(包括 StackOverflow 和其他地方)中,人们说要获取会话数据,必须获取客户端的 cookies,这些 cookies 由其请求 web 服务器时提供。以下代码旨在实现此目的:
$conn->WebSocket->request->getCookies()

其中$conn是一个ConnectionInterface

我的问题是,当运行此代码时,它仅返回一个空数组,尽管开发工具会显示确实存在cookie。

为什么可能不返回值?

1个回答

5

如果您仍在寻找解决方案:

1. 如果您的cookie仅适用于特定域名/子域名,那么您应该通过相同的地址与WebSocket服务器建立连接。例如,仅适用于admin.example.com的cookie不会发送到根域(example.com)上的WebSocket服务器。

2. 如果您的cookie仅适用于安全连接(https://),则您的WebSocket服务器也应该是安全连接(wss://)。使用最新版本的Ratchet很容易实现此目标。

$webSock = new React\Socket\Server('0.0.0.0:8443', $loop);
$webSock = new React\Socket\SecureServer($webSock, $loop, [
    'local_cert'        => 'path_to_server_cert',
    'local_pk'          => 'path_to_private_key',
    //'allow_self_signed' => TRUE,
    'verify_peer' => FALSE
]);

3. 在 Ratchet 0.4.x 中,不再有 cookie 解析器。您只能获得原始字符串,然后自行解析。

使用 Ratchet 0.4.x 获取和解析 cookies:

$cookiesRaw = $conn->httpRequest->getHeader('Cookie');

if(count($cookiesRaw)) {
    $cookiesArr = \GuzzleHttp\Psr7\parse_header($cookiesRaw)[0]; // Array of cookies
}

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