前言
Server-sent Events(简称 SSE)是一种让服务器主动向客户端推送数据的传输协议,它使用了类似长轮询的技术来保持连接并持续接收数据。SSE 相比于 WebSocket 更为轻量级,而且可以被浏览器缓存,适合实时推送更新的情况。
在实际应用场景中,我们往往需要对 SSE 进行认证,以确保只有授权用户才能收到实时推送的数据。本文将介绍如何在服务端进行 SSE 认证。
服务端认证步骤
第一步:建立 SSE 连接
在客户端通过 EventSource 构造函数建立 SSE 连接时,需要指定一个 URL 作为服务器链接的目标。例如:
const source = new EventSource('/sse');
服务端收到 SSE 的请求后,需要将响应标记为 SSE 类型,并发送一个“keep-alive”消息以保持连接。例如:
response.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', }); response.write(':keep-alive\n\n');
此时,连接已经建立成功,但无论哪个用户都可以连接该 SSE,因此需要进行认证。
第二步:校验用户权限
我们可以在 SSE 连接建立后,通过请求中的 cookie 或者 header 等信息,决定是否允许该连接。
例如,通过 cookie 认证:
-- -------------------- ---- ------- ----- ------- - ------------------------------------- ----- ------- - ----- ------------------------------ -- --------- -- ---------------- - ------------------- - ---- ----------------- ------------- ------- - ----------------------- - --------------- -------------------- ---------------- ----------- ------------- ------------- --- ----------------------------------
其中,parseCookies 函数是将请求的 cookie 字符串转换成对象的工具函数,getSession 函数是获取用户 session 对象并校验过期的业务逻辑函数。如果用户未登录或者 session 已经过期,则向客户端返回 401 错误,否则继续发送数据流。
第三步:发送实时数据
最后,我们通过 response 对象一直向客户端发送实时数据,例如:
while (true) { const data = await getNewData(); const event = `event: update\ndata: ${JSON.stringify(data)}\n\n`; response.write(event); await wait(1000); }
其中,getNewData 函数是获取实时数据的业务逻辑函数,wait 函数是暂停一定时间的工具函数。我们可以将实时数据包装成一个名为“update”的 SSE 事件类型,并将数据 JSON 序列化后发送给客户端。
总结
本文介绍了如何在服务端完成 SSE 的认证,并通过示例代码详细说明了每一个步骤。实际上,SSE 认证的方式是灵活多变的,可以根据具体业务需求进行调整。但核心思想不变:建立 SSE 连接后,根据客户端的信息决定是否允许该连接,并持续发送实时数据。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f521d9f6b2d6eab3dd33e7