使用websocket连接时,对用户进行身份验证的可能方法是什么?
示例场景:基于Web的多用户聊天应用程序通过加密的websocket连接。如何确保(或保证)此应用程序中的每个连接都属于某个经过身份验证的用户,并且在连接过程中假冒用户模拟“无法”利用它。
答案 0 :(得分:42)
如果您已经对应用程序的非websocket部分进行身份验证,则只需在连接后将会话cookie作为第一条消息传递,并像往常一样检查cookie。
警告:有人指出使用闪光灯时以下内容不起作用:
如果您使用socket.io,则更容易 - Cookie会在连接时自动传递,并且可以像下面这样访问:
var io = require('socket.io');
var socket = io.listen(app);
socket.on('connection', function(client){
cookies = client.headers['cookie'];
});
答案 1 :(得分:3)
SSL / TLS可用于使用X.509证书对客户端和服务器进行身份验证。这取决于您使用的Web应用程序平台。在apache中,可以针对有效的已知证书列表检查SSL_CLIENT_CERT environment variable的有效性。这不需要使用完整的PKI,也不需要您为每个客户购买证书。虽然我建议使用CA来支持服务器的ssl证书。
答案 2 :(得分:0)
有两种方法。
一种方法是允许任何人打开websocket连接。打开连接后,让客户端发送授权令牌作为第一条消息。如果客户端在一段时间内未发送有效令牌,请关闭连接。
另一种方法是使用cookie(浏览器会在每次请求时自动发送cookie)。这就要求您实施CSRF保护(比起正常情况还要多,因为Websocket没有相同的原始策略(SOP)。您可以找到详细信息here。概述如下:
SameSite=Strict
设置“ websocket auth” cookie Origin
标头的值与批准的域匹配第一种方法较为简单,但缺点是它要求您具有一些服务器端状态,以等待客户端进行身份验证。这可以使攻击者通过消耗所有可用的套接字来执行拒绝服务攻击。