当使用WebSocket连接时,有哪些可能的方式可以进行用户身份验证?
示例场景:通过加密的WebSocket连接的基于Web的多用户聊天应用程序。如何确保每个连接都属于某个经过身份验证的用户,并且在连接期间无法被伪造的用户所利用。
如果您已经为应用程序的非 WebSocket 部分执行身份验证,请在连接后将会话 cookie 作为第一条消息传递,并像通常一样检查 cookie。
警告:当使用 FlashSocket 时,以下内容不起作用:
如果您正在使用 socket.io,则更加容易,因为 cookies 会在连接时自动传递,并可以按以下方式访问:
var io = require('socket.io');
var socket = io.listen(app);
socket.on('connection', function(client){
cookies = client.headers['cookie'];
});
有两种方法。
一种方法是允许任何人打开websocket连接。在连接打开后,客户端发送授权令牌作为第一条消息。如果客户端在一定时间内未发送有效令牌,则关闭连接。
另一种方法是使用cookie(它们由浏览器在每个请求中自动发送)。这需要您实现CSRF保护(比通常更多,因为没有同源策略(SOP)用于websocket)。您可以在这里找到详细信息。概述如下:
SameSite=Strict
的“websocket auth” cookieOrigin
标头的值是否与已批准的域匹配第一种方法更简单,但缺点是需要您拥有一些服务器端状态等待客户端进行身份验证。这可能会允许攻击者通过消耗所有可用套接字来执行拒绝服务攻击。