支持简单 HTTP 和 Websocket 的服务器上的用户身份验证
Posted
技术标签:
【中文标题】支持简单 HTTP 和 Websocket 的服务器上的用户身份验证【英文标题】:User authentication on server supporting both simple HTTP and Websocket 【发布时间】:2018-06-24 10:36:14 【问题描述】:用户可以通过简单的 HTTP 或 Websocket 连接到服务器。
当 HTTP 会话过期时,Websocket 会话会发生什么? 当 Websocket 会话关闭时,HTTP 会话会发生什么?
如何在支持这两种协议的服务器上处理用户身份验证?
【问题讨论】:
请避免同时提出多个不同的问题。请参阅How to Ask 页面以获得澄清此问题的帮助。 【参考方案1】:RFC 6455 是定义 WebSockets 协议的文档,它没有规定任何特定的客户端身份验证方式:
10.5. WebSocket Client Authentication
此协议没有规定服务器可以在 WebSocket 握手期间验证客户端的任何特定方式。 WebSocket 服务器可以使用通用 HTTP 服务器可用的任何客户端身份验证机制,例如 cookie、HTTP 身份验证或 TLS 身份验证。
虽然 WebSocket 和 HTTP 可以从相同的基础设施(代理、过滤、身份验证)中受益,但请记住,HTTP 和 WebSocket 是不同的通信渠道,在设计身份验证机制:一个常见的误解是,在托管 Web 应用程序中进行身份验证的用户也在套接字流中进行身份验证。
【讨论】:
【参考方案2】:这实际上取决于您的应用程序如何处理它。正如@Myst 提到的,通常只有一个会话cookie - HTTP 会话。当该会话无效时,您的服务器应用程序可以关闭 websocket,或者在下次建立连接之前保持打开状态。这只是您何时检查附加到 websocket 的会话的问题:仅在建立连接时?或收到消息时?
【讨论】:
【参考方案3】:一般来说,通常只有一个会话 cookie - HTTP 会话。
由于 WebSocket 连接以 HTTP 开始,因此连接通常在 HTTP 阶段进行身份验证,并且只有在身份验证成功后才升级到 WebSocket...
...这取决于应用程序的设计,但通常是这样。
如果在 WebSocket 连接建立后会话无效,则连接将(通常)保持打开状态并经过身份验证(因为大多数应用程序在连接建立后不会重复身份验证阶段)。
【讨论】:
以上是关于支持简单 HTTP 和 Websocket 的服务器上的用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章