Laravel 8下Ratchet接入会话后无法访问Laravel Auth的问题排查
核心问题定位
- 你在onOpen阶段解密得到的81位字符串,是Laravel 5.6及以上版本默认的加密Cookie结构:
40位CSRF校验哈希 | 分隔符 | 40位纯会话ID,总长度刚好和你打印的结果匹配。你没有拆分这个结构,直接把整串传给会话的setId()方法,传入的根本不是有效的会话ID格式。 - Laravel的会话类在
setId()完成后,会校验传入ID对应的会话记录是否存在、是否符合安全规则,如果校验不通过,会自动触发migrate()逻辑生成全新的随机会话ID。这就是为什么你两次打印getId()都拿到和传入值完全不同的随机40位字符串——你之前手动设置的ID已经被系统自动覆盖了。 - 你在
onMessage阶段调用的$conn->session->start(),会在新生成的空会话ID基础上重新走一遍初始化流程,自然读不到原有登录用户的会话数据,所以读取Auth::getName()对应的会话值永远是null。
适配Laravel 8.x的修正实现
1. 修正onOpen阶段的会话加载逻辑
- 拆分解密后的Cookie值结构,提取第二段作为真正的纯会话ID
- 在连接建立阶段就完成会话ID设置、启动加载全流程,提前把会话数据和连接实例绑定
public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); // 初始化对应驱动的会话管理器 $session = (new SessionManager(App::getInstance()))->driver(); // 解析WebSocket握手请求携带的Cookie $cookiesRaw = $conn->httpRequest->getHeader('Cookie'); $cookies = []; if (count($cookiesRaw)) { $cookies = Header::parse($cookiesRaw)[0]; } // 解密Cookie值,拆分结构提取真实会话ID $encryptedCookieValue = urldecode($cookies[Config::get('session.cookie')]); $decryptedParts = explode('|', Crypt::decrypt($encryptedCookieValue, false)); $realSessionId = $decryptedParts[1]; // 设置合法的会话ID,触发原有会话数据加载 $session->setId($realSessionId); $session->start(); // 将加载完成的会话实例绑定到当前连接 $conn->session = $session; }
2. 简化onMessage阶段的逻辑
- 去掉重复的会话启动调用,避免二次初始化触发会话重建
- 直接读取已经绑定完成的会话数据,无需重复走初始化校验流程
public function onMessage(ConnectionInterface $conn, MessageInterface $msg) { // 直接读取绑定在连接上的会话ID验证加载是否成功 $sessionId = $conn->session->getId(); var_dump($sessionId); // 原有消息解析逻辑保持不变 $decoded = json_decode(base64_decode($msg), true); if (is_null($decoded) || array_diff(['message'], array_keys($decoded))) { return; } var_dump($decoded['message']); // 此时可正常读取登录用户信息 var_dump($conn->session->get(Auth::getName())); }
额外注意事项
- 确保WebSocket CLI进程和Web请求进程使用完全一致的会话存储配置,包括驱动类型、存储路径、加密密钥,否则即使会话ID正确,也无法读取到对应存储里的会话数据。
- 测试完成后可以去掉前端主动发送Blade渲染会话ID的逻辑,WebSocket握手阶段浏览器会自动携带对应域名下的Cookie,直接从请求头解析即可,无需额外暴露会话ID到前端代码中。
- 不要为了跳过校验直接禁用Laravel的CSRF绑定检查,否则会引入会话固定攻击风险,生产环境需保留会话值的合法性校验逻辑。
内容的提问来源于stack exchange,提问作者Jaquarh
相关产品推荐
相关产品推荐

