2010-04-23 20 views
28

Quali sono i modi possibili per autenticare l'utente quando viene utilizzata la connessione WebSocket?Autenticazione WebSockets

Scenario di esempio: applicazione chat multiutente basata sul web tramite connessione websocket crittografata. Come posso garantire (o garantire) che ogni connessione in questa applicazione appartenga a determinati utenti autenticati e che "non possa essere" sfruttata dalla falsa rappresentazione dell'utente durante la connessione.

risposta

3

SSL/TLS può essere utilizzato per autenticare client e server utilizzando certificati X.509. Dipende dalla piattaforma applicativa web che stai utilizzando. In apache è possibile verificare la validità di SSL_CLIENT_CERT environment variable per verificare la validità di un elenco di certificati noti. Ciò non richiederebbe l'utilizzo di una PKI completa e non richiederebbe l'acquisto di certificati per ciascun cliente. Anche se consiglio di utilizzare una CA per il certificato SSL del server.

+0

Intendi che il certificato SSL verrà utilizzato rispettivamente per la connessione HTTP e WebSocket? – yojimbo87

+0

Non sono d'accordo su cosa ha detto la torre. SSL/TLS può garantire che i dati non vengano modificati nel livello di trasporto. Ma il problema qui è che come possiamo sapere che la richiesta del web socket è dell'utente A non dell'utente B? Immagine sia l'utente A che B sono connessi. Come web-socket non invia cookie dopo che la connessione è stata stabilita. Quindi, in seguito, in che modo questo web-socked garantisce che la richiesta provenga dal vero utente A piuttosto che dall'utilizzatore B? –

41

Se si sta già eseguendo l'autenticazione per la parte non-websocket della propria app, basta passare il cookie di sessione come primo messaggio dopo la connessione e controllare il cookie come faresti normalmente.

AVVERTENZA: E 'stato sottolineato che il seguente non funziona quando si utilizzano flashsockets:
Se stai usando socket.io, è ancora più facile-i biscotti sono passati attraverso automaticamente sulla connessione, e si può accedere come il seguente:

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

Sei sicuro che funzioni sempre? Se Socket.IO ritorna sui socket Flash, ad esempio, i cookie del browser non verranno inviati (AFAIK). – Thomas

+1

@Thomas hai ragione, c'è un [problema archiviato] (https://github.com/LearnBoost/socket.io/issues/101) che dice che dovresti fare l'autenticazione tramite il primo messaggio. –

+1

Questo è un metodo pratico, ma richiede che la pagina Web faccia il login (e l'impostazione dei cookie) dalla stessa origine del WebSocket, altrimenti il ​​cookie (impostato dalla pagina di accesso) non verrà inviato sul Connessione WebSocket. – oberstet