拓冰建站拓冰建站
首页 / 资讯中心 / 正文

y-websocket 安全实践:基于 Cookie 与 Header 的现有认证机制集成指南

y-websocket 安全实践基于 Cookie 与 Header 的现有认证机制集成指南【免费下载链接】y-websocketWebsocket Connector for Yjs项目地址: https://gitcode.com/gh_mirrors/yw/y-websockety-websocket 安全实践在开始集成认证之前先认识这个项目——它是 Yjs 实时协同生态中最常用的 WebSocket 连接器Websocket Connector for Yjs负责在客户端与服务器之间同步协同文档与在线状态。默认的演示服务器对任何知道房间名的人开放直接上生产存在数据泄露风险。本文提供一套基于 Cookie 与 Header 的现有认证机制集成指南覆盖服务端握手校验、客户端 Token 传递与刷新、连接后二次鉴权并附上可照抄的代码片段。更多 API 说明见官方文档 README.md。为什么 y-websocket 需要接入现有认证机制y-websocket 的定位是连接层本身不负责业务账号体系。仓库自带的演示服务器bin/server.cjs是纯内存实现只要有人猜到或泄露了房间名roomname就能直接连接并读写协同数据。对于文档协作、白板、在线表格这类产品这意味着⚠️ 未授权用户可读取房间内的全部协同内容⚠️ 未授权用户可向房间注入恶意更新⚠️ 没有身份标识无法做只读/可写/管理员等权限分级。因此把 y-websocket 接入你现有的认证机制Session、Cookie、JWT 等是上线前必须完成的一步。好消息是WebSocket 握手本身就是一次 HTTP 请求天然支持 Cookie 与 Header官方文档也明确指出WebSocket 会发送请求头与 Cookie可以直接复用现有认证机制README.md。先看懂连接流程认证校验应该放在哪一步客户端创建WebsocketProvider时会拼接出最终连接地址serverUrl / roomname ? 查询参数见 src/y-websocket.js 的urlgetter。随后浏览器发起 WebSocket 握手这是一次携带 Cookie 和请求头的 HTTP Upgrade 请求。服务端的校验入口在 bin/server.cjs 的upgrade事件中先校验身份通过后再调用wss.handleUpgrade升级连接否则直接销毁 socket。这个位置就是 y-websocket 认证集成的核心改造点。方案一y-websocket 基于 Cookie 的认证集成Cookie 认证原理同源 WebSocket 自动携带会话当页面与 y-websocket 服务同域部署如统一走wss://api.example.com反向代理时浏览器会在 WebSocket 握手请求中自动附带当前域的 Cookie。这意味着客户端代码几乎零改动你现有的 Session/Cookie 登录体系直接生效这也是最省事的 y-websocket 认证集成方式。服务端改造在 upgrade 事件中校验 Cookieserver.on(upgrade, (request, socket, head) { // 从请求头取出 Cookie调用你现有的会话校验逻辑 if (!isValidSession(request.headers.cookie)) { socket.write(HTTP/1.1 401 Unauthorized\r\n\r\n) socket.destroy() // 握手失败立即拒绝 return } wss.handleUpgrade(request, socket, head, ws { wss.emit(connection, ws, request) }) })要点isValidSession可以直接复用你 Web 应用里解析 Session Cookie 的函数无需为 WebSocket 另写一套登录逻辑。跨域场景的注意点Cookie 方案依赖同源。如果页面和 y-websocket 服务分属不同域名浏览器不会自动携带 Cookie此时建议切换到方案二或通过反向代理让 WebSocket 与页面同源。方案二y-websocket 基于 Header 的认证集成Token 方案浏览器限制WebSocket API 无法自定义 Header很多人以为可以在浏览器里给 WebSocket 加Authorization头但原生 WebSocket API 并不支持自定义请求头。因此Header 认证在浏览器端有两类等价实现服务端都能从握手请求中读到。路径一用 protocols 子协议传递 Tokenprotocols选项会映射为握手请求的Sec-WebSocket-Protocol请求头客户端配置见 src/y-websocket.jsconst provider new WebsocketProvider(wss://collab.example.com, room-a, doc, { protocols: [bearer, eyJhbGciOiJIUzI1NiJ9...] // 子协议中携带 Token })服务端读取const proto request.headers[sec-websocket-protocol] || const token proto.startsWith(bearer) ? proto.split(, )[1] : null路径二用 params 查询参数传递 Token支持定时刷新更常见的是把 Token 放进查询参数服务端从request.url中解析const provider new WebsocketProvider(wss://collab.example.com, room-a, doc, { params: { token: eyJhbGciOiJIUzI1NiJ9... } }) // Token 即将过期时直接更新下次重连自动携带新值 provider.params.token new-tokenprovider.params可以在运行期安全更新新的值会在下一次重连接时生效非常适合短时效 Token 的场景。服务端解析方式const token new URL(request.url, http://localhost).searchParams.get(token)Node.js 客户端如何认证Node.js 端通过WebSocketPolyfill: require(ws)使用 ws 包而 ws 客户端不会自动携带 Cookie因此推荐同样走params或protocols传 Token服务端无需区分运行环境。连接建立后的二次校验auth 消息机制握手通过不等于万事大吉。y-websocket 客户端内置了对 y-protocols auth 消息type2的处理src/y-websocket.js如果服务端在连接建立后发送鉴权拒绝消息客户端会触发permissionDeniedHandler在控制台输出 Permission denied to access ...src/y-websocket.js。默认的 bin/utils.cjs 把messageAuth注释掉了你可以在setupWSConnection中按房间维度做细粒度授权有权限则正常同步无权限则发送 auth 拒绝消息并关闭连接。建议把粗粒度身份校验放在握手阶段把房间级细粒度授权放在 auth 消息阶段两层配合。y-websocket 认证集成的安全最佳实践清单✅ 生产环境必须使用 WSSwss://防止 Token、Cookie 在传输中被窃听✅ Cookie 设置HttpOnly、Secure、SameSite属性✅ Token 尽量不放查询参数长期使用URL 可能被日志记录改用短时效 Token 并定期刷新provider.params✅ 服务端校验 roomname 格式避免路径穿越等异常访问✅ 鉴权失败统一返回 401/403 并立即销毁 socket减少无效连接开销✅ 为 y-websocket 服务配置连接数上限与频率限制防止资源耗尽✅ 密钥、签名私钥等敏感信息严禁出现在前端代码中。常见问题排查速查表现象可能原因解决思路握手被 401/403 拒绝Cookie 未携带跨域或域名不一致、Token 过期同源部署使用短时效 Token 并定时刷新浏览器无法设置 WebSocket 自定义 Header原生 WebSocket API 限制改用protocols或params传递连接成功但提示 Permission denied服务端 auth 消息拒绝了房间级权限检查授权逻辑与messageAuth发送时机Node.js 客户端拿不到会话ws 客户端不自动携带 Cookie改用params/protocols传 Token总结y-websocket 认证集成的关键是抓住 WebSocket 握手这一HTTP 关口同源部署时用 Cookie 方案几乎零成本复用现有登录体系跨域或 Token 场景下用protocols子协议或params查询参数传递凭证再配合 auth 消息做房间级二次鉴权就能在不改动 y-websocket 同步逻辑的前提下为实时协同功能加上完整的安全防护。【免费下载链接】y-websocketWebsocket Connector for Yjs项目地址: https://gitcode.com/gh_mirrors/yw/y-websocket创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门