WebSocket身份验证

问题描述:

当使用websocket连接时,对用户进行身份验证的可能方式是什么?WebSocket身份验证

示例场景:通过加密的websocket连接基于Web的多用户聊天应用程序。如何确保(或保证)此应用程序中的每个连接都属于某个经过身份验证的用户,并且在连接期间“不能”被虚假用户模拟利用。

SSL/TLS可用于使用X.509证书对客户端和服务器进行身份验证。这取决于您正在使用的Web应用程序平台。在Apache中,SSL_CLIENT_CERT environment variable可以根据已知证书列表的有效性进行检查。这不需要使用完整的PKI,也不需要您为每个客户购买证书。虽然我建议使用CA来备份您的服务器的SSL证书。

+0

您的意思是SSL证书将分别用于HTTP和WebSocket连接? – yojimbo87 2010-04-23 20:00:27

+0

我不同意这么说。 SSL/TLS可以确保传输层中的数据不会发生变化。但是这里的问题是我们如何知道web套接字请求来自用户A而不是用户B?图像用户A和B都登录。由于web-socket在连接建立后不发送cookie。所以在以后,这个web-socked如何确保请求来自真实用户A而不是用户B? – 2016-09-29 06:19:49

如果您已经在为您的应用的非websocket部分进行身份验证,只需在连接之后将第一条消息作为第一条消息一起传递,并像平常一样检查cookie。

警告:它已经指出,当flashsockets使用以下不起作用:
如果您使用socket.io,那就更简单了,饼干都是通过自动连接上通过,并可以访问如下所示:

var io = require('socket.io'); 
var socket = io.listen(app); 
socket.on('connection', function(client){ 
    cookies = client.headers['cookie']; 
}); 
+4

你确定这总是有效吗?例如,如果Socket.IO退回到Flash套接字上,浏览器Cookie将不会发送(AFAIK)。 – Thomas 2012-03-18 10:07:57

+1

@Thomas你是对的,有一个[问题提交](https://github.com/LearnBoost/socket.io/issues/101),提到你应该通过第一条消息进行身份验证。 – 2012-06-26 16:08:57

+1

这是一种实用的方法,但它要求登录(和cookie设置)与WebSocket来源相同的Web页面,否则cookie(从登录页面设置)不会发送到WebSocket连接。 – oberstet 2013-12-11 17:27:54