2012-01-06 16 views
14

Sto lavorando a una piccola partita multiplayer. Mi piacerebbe introdurre l'autenticazione. Sto usando Node.js e Socket.io.autenticazione socket.io dopo il socket stabilito

Quando l'utente arriva alla pagina principale, voglio che si uniscano al gioco indipendentemente dal fatto che abbiano effettuato l'accesso o meno, ma non saranno in grado di fare nulla all'interno di esso (solo guardare).

Come è possibile procedere con l'autenticazione dell'utente sulla presa già aperta?

Posso mantenere l'autenticazione ancora se hanno lasciato il sito e sono tornati? Puoi passare un cookie attraverso una presa di rete?

EDIT

per continuare la mia domanda. Uno dei possibili pensieri che ho avuto è quello di fornire la connessione websocket, quindi quando cercano di accedere, passa nome utente e password come un messaggio al websocket.

client.on('onLogin', loginfunction); 

ho potuto poi prendere il nome utente e la password, controllare sul database, quindi prendere l'ID di sessione della presa e passarlo da qualche parte per dire che la sessione è autenticata a quell'utente.

È sicuro? Potrei ancora implementare un cookie sul socket in modo che possano tornare? C'è un modo dentro socket.io di affermare che il socket è ora autenticato invece di controllare manualmente ogni messaggio ricevuto?

Acclamazioni

+0

Esiste un modo forse di impostare la connessione come autenticata all'interno socket.io dopo che la connessione è stata stabilita e stretta di mano completa? L'utente può fornire i dettagli di accesso quando è pronto per una connessione esistente, il server può convalidare e restituire un ID sessione univoco. Il lato client javascript potrebbe quindi salvare un cookie per uso futuro. –

+0

Vedere [questo articolo] (http://www.danielbaulig.de/socket-ioexpress/) su come autenticare le sessioni di socket.io. – fent

+0

Sì, ho già letto quell'articolo. Anche se sono abbastanza contento di impostare un cookie, non consente l'accesso alla stessa pagina se il socket è già aperto. Soffre anche presumibilmente se l'utente ha disabilitato i cookie? –

risposta

5

Questo non è in realtà troppo difficile, ma si sta avvicinando nel modo sbagliato.Un paio di cose:

  1. Non è possibile impostare un cookie con socket.io; puoi, tuttavia, ottenere i valori dei cookie di qualsiasi cliente connesso in qualsiasi momento. Per impostare un cookie, dovrai inviare una nuova risposta http, il che significa che l'utente deve prima inviare una nuova richiesta http (ovvero aggiornare o andare a una nuova pagina, che suona non è una possibilità per te qui).

  2. Sì: socket.io è sicuro (nella misura in cui i dati trasmessi possono essere).

Come tale, è possibile effettuare le seguenti operazioni:

Al momento della connessione iniziale dell'utente, creare un cookie con un ID di sessione univoco, come quelli generati dal middleware seduta di Express. Dovrai configurarli per non scadere alla fine della sessione (altrimenti scadrà non appena chiuderanno il browser).

Quindi è necessario creare un oggetto per memorizzare gli ID sessione cookie. Ogni volta che viene impostato un nuovo cookie connect.sid, memorizzare nel nuovo oggetto un valore predefinito di false (ovvero l'utente è stato autenticato dalla sessione, ma non dall'accesso)

All'accesso dell'utente, inviare una presa emettere sul server, dove è possibile quindi autenticare le credenziali di accesso e successivamente aggiornare l'oggetto id di sessione creato per leggere true (loggato) per l'id del socket corrente.

Ora, quando si riceve una nuova richiesta http, leggere cookie.sid e verificare se il suo valore nell'oggetto è true.

Dovrebbe essere qualcosa come il seguente:

var express = require('express'), 
http = require('http'), 
cookie = require('cookie'); 

var app = express(); 
var server = http.createServer(app); 
var io = require('socket.io').listen(server); 


app.use(express.cookieParser()); 
app.use(express.session({ 
    secret: 'secret_pw', 
    store: sessionStore, 
    cookie: { 
     secure: true, 
     expires: new Date(Date.now() + 60 * 1000), //setting cookie to not expire on session end 
     maxAge: 60 * 1000, 
     key: 'connect.sid' 
    } 
})); 

var sessionobj = {}; //This is important; it will contain your connect.sid IDs. 

//io.set('authorization'...etc. here to authorize socket connection and ensure legitimacy 


app.get("/*", function(req, res, next){ 
    if(sessionobj[req.cookies['connect.sid']]){ 
     if(sessionobj[req.cookies['connect.sid']].login == true){ 
      //Authenticated AND Logged in 
     } 
     else{ 
      //authenticated but not logged in 
     } 
    } 
    else{ 
     //not authenticated 
    } 

}); 


io.sockets.on('connection', function(socket){ 
    sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid'].login = false; 
    sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid'].socketid = socket.id; 

    socket.on('login', function(data){ 
     //DB Call, where you authenticate login 
     //on callback (if login is successful): 
     sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid']] = true; 
    }); 

    socket.on('disconnect', function(data){ 
     //any cleanup actions you may want 
    }); 

}); 
+0

correggimi se ho torto, ma non sono sessioni che non scadono mai sono generalmente considerate non sicure – brthornbury

+0

@Mozoby Il mio codice sta impostando il cookie per scadere dopo che è trascorso un certo periodo di tempo - non è indefinito. L'ho fatto perché la domanda originale sembrava indicare che gli utenti di ritorno dovrebbero comunque essere loggati, il che significa che non posso lasciare i cookie scadere alla chiusura del browser come fanno di default. – Ari

2

Chris, io non sarà in grado di rispondere visto che non sono un esperto di socket.io, ma posso forse cercare di puntare in un'altra direzione che può aiutare - e togliere tempo di sviluppo.

Ma prima, un disclaimer: lavoro per Realtime.co e non sto cercando di fare alcun tipo di pubblicità. Lavoro a stretto contatto con gli sviluppatori e sto solo cercando di aiutarti fornendo una soluzione pronta per il tuo problema. Inoltre, essendo un giocatore, non posso stare lontano dal cercare di aiutare le persone a fare i loro giochi là fuori!

In tempo reale utilizza un livello di autenticazione/autorizzazione in cui è possibile fornire autorizzazioni di lettura/scrittura ai canali. Quando gli utenti accedono al sito Web, puoi dare loro solo le autorizzazioni di lettura per il canale del gioco e, una volta effettuato l'accesso, puoi concedere loro le autorizzazioni di scrittura. Questo può essere fatto facilmente facendo un post di autenticazione e ricollegandosi al server (può essere fatto tutto dal lato client). Lo farei dal lato server, però, per aumentare la sicurezza.

Realtime ha un'API Node.js che consente di integrarlo facilmente con il proprio server. Poiché dispone anche di API per molte altre piattaforme (incluso quelle mobili) e funzionano tutte allo stesso modo, puoi effettivamente far funzionare il tuo gioco su più piattaforme sullo stesso livello di comunicazione, pur avendo il pieno controllo sui canali.

Grazie per la lettura.

Edit:

È possibile leggere la documentazione qui per ulteriori informazioni: http://docs.xrtml.org/

Problemi correlati