Esistono due soluzioni generiche a questo problema. Entrambe le soluzioni si basano sull'approccio a non pubblicare informazioni nel pubblico che non dovrebbero essere pubbliche. Ciò implica che devi implementare una sorta di meccanismo di autenticazione nella tua applicazione, ad es. un modulo di accesso che crea una nuova sessione (e nuove chiavi di sessione temporali). Inutile dire che dovresti usare https
/ wss
invece di http
/ ws
.
Il primo metodo è pubblicare solo eventi pubblici e recuperare i dati degli eventi privati su un canale separato (ad esempio una nuova richiesta HTTP). Questo è ciò che lo Stack Exchange fa con le notifiche di casella di posta in arrivo: i socket vengono utilizzati solo per informare gli iscritti dei nuovi messaggi di posta in arrivo, mentre il contenuto effettivo viene recuperato solo su http quando l'utente fa clic sul fumetto di notifica.
Il secondo metodo consiste nell'autenticare la connessione Socket.IO prima di archiviare il socket sul lato server. In Socket.IO, puoi passare informazioni extra con l'handshake tramite l'opzione query
. Sul server, leggi questo valore e consenti agli utenti di creare il socket solo dopo aver eseguito correttamente l'autenticazione ( esempio la risposta accettata è per socket.io 0.9, guarda qui per socket.io 1.x ). Questa chiave dovrebbe essere trattata come un cookie di sessione. Quando l'utente si disconnette, il socket associato a questa chiave dovrebbe essere distrutto e il token invalidato. Idealmente, questa chiave dovrebbe essere usata una sola volta (cioè invalidata dopo il primo utilizzo), ma in pratica non funziona se la connessione non è affidabile e devi continuare a riconnetterti a Socket.IO.
In alternativa al rifiuto del socket (metodo 2), è possibile anche accettare il socket e utilizzare i dettagli di autenticazione per controllare se un utente è autorizzato a iscriversi a un evento oa entrare in una stanza. Il client riceverà un evento solo se lo invii al server, quindi se non invii l'evento (ad es. Perché l'utente non si trova nella stanza in cui è trasmesso l'evento), non ci sono perdite di informazioni.