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

Toa*_*gma 3 php cookies websocket ratchet

我有一个 PHP Ratchet WebSocket 服务器,在我的网站上运行自定义聊天室。

我想在用户连接到服务器时获取用户的 cookie,以便我可以获取他们的会话数据,并在他们登录/具有特定权限/等时执行一些特殊操作。

在其他帖子(StackOverflow 和其他帖子)中,据说要获取会话数据,您必须获取客户端的 cookie,这些 cookie 在向 Web 服务器的请求中提供。以下代码行旨在执行此操作:

$conn->WebSocket->request->getCookies()
Run Code Online (Sandbox Code Playgroud)

哪里$conn有一个ConnectionInterface.

我的问题是,当运行时,它只是返回一个空数组,即使 DevTools 会显示确实有 cookie。

为什么这可能不会返回值?

小智 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
]);
Run Code Online (Sandbox Code Playgroud)

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

使用 Ratchet 0.4.x 获取并解析 cookie:

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

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