2010-04-23 36 views
28

¿Cuáles son las formas posibles de autenticar al usuario cuando se usa la conexión websocket?Autenticación de WebSockets

Escenario de ejemplo: aplicación de chat multiusuario basada en web a través de conexión de websocket encriptada. ¿Cómo puedo garantizar (o garantizar) que cada conexión en esta aplicación pertenece a cierto usuario autenticado y "no puede ser" explotada por suplantación de usuario falsa durante la conexión.

Respuesta

3

SSL/TLS se puede utilizar para autenticar tanto al cliente como al servidor utilizando certificados X.509. Depende de la plataforma de aplicaciones web que esté utilizando. En apache, SSL_CLIENT_CERT environment variable se puede verificar su validez con una lista de certificados conocidos para que sea válida. Esto no requeriría el uso de una PKI completa, y no requeriría que usted compre certificados para cada cliente. Aunque recomiendo usar una CA para respaldar el certificado ssl de tu servidor.

+0

¿Quiere decir que el certificado SSL se utilizará para las conexiones HTTP y WebSocket, respectivamente? – yojimbo87

+0

No estoy de acuerdo con lo que dijo la torre. SSL/TLS puede garantizar que los datos no se modifiquen en la capa de transporte. Pero el problema aquí es que ¿cómo podemos saber que la solicitud del socket web es del usuario A y no del usuario B? La imagen del usuario A y B está conectada. Como el socket web no envía cookies una vez establecida la conexión. Entonces, más adelante, ¿cómo asegura este contenido web la solicitud del usuario real A en lugar del usuario B? –

41

Si ya está haciendo la autenticación para la parte que no es de websocket de su aplicación, simplemente pase la cookie de sesión como el primer mensaje después de conectarse y verifique la cookie como lo haría normalmente.

ADVERTENCIA: Se ha señalado que el siguiente no funciona cuando se utilizan flashsockets:
Si está utilizando socket.io, es aún más fácil, las galletas se hacen pasar a través de forma automática en la conexión, y se puede acceder como el siguiente:

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

¿Estás seguro de que esto siempre funciona? Si Socket.IO recae en sockets Flash, por ejemplo, las cookies del navegador no se enviarán (AFAIK). – Thomas

+1

@Thomas tienes razón, hay un [problema presentado] (https://github.com/LearnBoost/socket.io/issues/101) que menciona que debes hacer la autenticación a través del primer mensaje. –

+1

Este es un método práctico, pero requiere que la página web que realiza el inicio de sesión (y la configuración de cookies) proceda del mismo origen que WebSocket, ya que de lo contrario la cookie (configurada desde la página de inicio de sesión) no se enviará a la Conexión WebSocket. – oberstet