如何在服务端认证 Server-sent Events?

阅读时长 3 分钟读完

前言

Server-sent Events(简称 SSE)是一种让服务器主动向客户端推送数据的传输协议,它使用了类似长轮询的技术来保持连接并持续接收数据。SSE 相比于 WebSocket 更为轻量级,而且可以被浏览器缓存,适合实时推送更新的情况。

在实际应用场景中,我们往往需要对 SSE 进行认证,以确保只有授权用户才能收到实时推送的数据。本文将介绍如何在服务端进行 SSE 认证。

服务端认证步骤

第一步:建立 SSE 连接

在客户端通过 EventSource 构造函数建立 SSE 连接时,需要指定一个 URL 作为服务器链接的目标。例如:

服务端收到 SSE 的请求后,需要将响应标记为 SSE 类型,并发送一个“keep-alive”消息以保持连接。例如:

此时,连接已经建立成功,但无论哪个用户都可以连接该 SSE,因此需要进行认证。

第二步:校验用户权限

我们可以在 SSE 连接建立后,通过请求中的 cookie 或者 header 等信息,决定是否允许该连接。

例如,通过 cookie 认证:

-- -------------------- ---- -------
----- ------- - -------------------------------------
----- ------- - ----- ------------------------------

-- --------- -- ---------------- -
  ------------------- - ----
  ----------------- -------------
  -------
-

----------------------- -
  --------------- --------------------
  ---------------- -----------
  ------------- -------------
---
----------------------------------

其中,parseCookies 函数是将请求的 cookie 字符串转换成对象的工具函数,getSession 函数是获取用户 session 对象并校验过期的业务逻辑函数。如果用户未登录或者 session 已经过期,则向客户端返回 401 错误,否则继续发送数据流。

第三步:发送实时数据

最后,我们通过 response 对象一直向客户端发送实时数据,例如:

其中,getNewData 函数是获取实时数据的业务逻辑函数,wait 函数是暂停一定时间的工具函数。我们可以将实时数据包装成一个名为“update”的 SSE 事件类型,并将数据 JSON 序列化后发送给客户端。

总结

本文介绍了如何在服务端完成 SSE 的认证,并通过示例代码详细说明了每一个步骤。实际上,SSE 认证的方式是灵活多变的,可以根据具体业务需求进行调整。但核心思想不变:建立 SSE 连接后,根据客户端的信息决定是否允许该连接,并持续发送实时数据。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f521d9f6b2d6eab3dd33e7

纠错
反馈