2010-04-23 14 views
28

Welche Möglichkeiten gibt es, Benutzer zu authentifizieren, wenn eine Websocket-Verbindung verwendet wird?WebSockets-Authentifizierung

Beispielszenario: Webbasierte Multi-User-Chat-Anwendung durch verschlüsselte Websocket-Verbindung. Wie kann ich sicherstellen (oder garantieren), dass jede Verbindung in dieser Anwendung zu bestimmten authentifizierten Benutzern gehört und "nicht" durch falsche Benutzeridentität während der Verbindung ausgenutzt werden kann.

Antwort

3

Mit SSL/TLS können sowohl Clients als auch Server mit X.509-Zertifikaten authentifiziert werden. Dies hängt von der Web-Anwendungsplattform ab, die Sie verwenden. In Apache kann das SSL_CLIENT_CERT environment variable auf Gültigkeit gegen eine Liste von bekannten Zertifikaten überprüft werden, um gültig zu sein. Dies erfordert nicht die Verwendung einer vollständigen PKI und erfordert nicht, dass Sie Zertifikate für jeden Client erwerben müssen. Obwohl ich empfehle, eine CA zu verwenden, um das SSL-Zertifikat Ihres Servers zu sichern.

+0

Sie meinen, dass SSL-Zertifikat für HTTP bzw. WebSocket-Verbindung verwendet wird? – yojimbo87

+0

Ich stimme nicht überein, was der Turm gesagt hat. SSL/TLS kann sicherstellen, dass die Daten in der Transportschicht nicht geändert werden. Aber das Problem hier ist, dass wie können wir wissen, dass die Web-Socket-Anfrage von Benutzer A nicht Benutzer B ist? Abbildung beide Benutzer A und B sind angemeldet. Als Web-Socket sendet Cookie nicht, nachdem die Verbindung hergestellt wurde. Wie stellt diese Web-Socke später sicher, dass die Anfrage vom echten Benutzer A und nicht vom Benutzer B stammt? –

41

Wenn Sie bereits eine Authentifizierung für den Nicht-Websocket-Teil Ihrer App durchführen, übergeben Sie einfach den Sitzungscookie als erste Nachricht nach der Verbindung und überprüfen Sie den Cookie wie gewohnt.

ACHTUNG: Es ist darauf hingewiesen worden, dass die folgende funktioniert nicht, wenn flashsockets verwendet:
Wenn Sie socket.io verwenden, ist es noch einfacher die Cookies werden durch automatisch auf der Verbindung übergeben und kann zugegriffen werden wie die folgenden:

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

Sind Sie sicher, dass das immer funktioniert? Wenn Socket.IO wieder auf Flash-Sockets zurückfällt, werden Browser-Cookies (AFAIK) nicht gesendet. – Thomas

+1

@Thomas du hast Recht, es gibt eine [Problem eingereicht] (https://github.com/LearnBoost/socket.io/issues/101), die erwähnt, dass Sie stattdessen Authentifizierung über die erste Nachricht tun sollten. –

+1

Dies ist eine praktische Methode, aber es erfordert, dass die Webseite, die den Login (und die Cookie - Einstellung) vom selben Ursprung wie der WebSocket ausführt, da sonst der Cookie (gesetzt von der Login - Seite) nicht auf den gesendet wird WebSocket-Verbindung. – oberstet