Authentification socket.io après avoir établi le socket

Je travaille sur un petit jeu multijoueur. J’aimerais vous présenter l’authentification. J’utilise Node.js et Socket.io.

Lorsque l’utilisateur arrive à la page principale – je veux qu’il rejoigne le jeu, qu’il soit connecté ou non -, il ne pourra rien faire à l’intérieur (uniquement regarder).

Comment puis-je alors authentifier l’utilisateur sur le socket déjà ouvert?

Pourrais-je conserver l’authentification encore s’ils quittaient le site et revenaient? Pouvez-vous transmettre un cookie via une prise Web?

MODIFIER

Pour approfondir ma question. Une des idées possibles que j’ai eu est de fournir la connexion websocket, puis quand ils essaient de se connecter, il transmet le nom d’utilisateur et le mot de passe en tant que message à la websocket.

client.on('onLogin', loginfunction); 

Je pourrais alors prendre le nom d’utilisateur et le mot de passe, vérifier la firebase database, puis prendre l’ID de session du socket et le transmettre quelque part pour indiquer que la session est authentifiée auprès de cet utilisateur.

Est-ce sécurisé? Pourrais-je quand même mettre en place un cookie sur le socket afin qu’ils puissent revenir? Est-ce qu’il y a un moyen dans socket.io de dire que le socket est maintenant authentifié au lieu de vérifier manuellement chaque message reçu?

À votre santé

Ce n’est pas vraiment difficile, mais vous l’abordez dans le mauvais sens. Quelques choses:

  1. Vous ne pouvez pas définir de cookie avec socket.io; vous pouvez toutefois obtenir les valeurs de cookie de tout client connecté à tout moment. Afin de définir un cookie, vous devrez envoyer une nouvelle réponse http, ce qui signifie que l’utilisateur doit d’abord envoyer une nouvelle demande http (c’est-à-dire actualiser ou aller sur une nouvelle page, ce qui semble ne pas être possible ici).

  2. Oui: socket.io est sécurisé (dans la mesure où toutes les données transmises peuvent l’être).

En tant que tel, vous pouvez effectuer les opérations suivantes:

Sur la connexion initiale de l’utilisateur, créez un cookie avec un ID de session unique, tel que ceux générés à partir du middleware de session d’Express. Vous devrez toutefois configurer ces derniers pour qu’ils n’expirent pas à la fin de la session (sinon, ils expireront dès qu’ils fermeront leur navigateur).

Ensuite, vous devez créer un object pour stocker les identifiants de session de cookies. Chaque fois qu’un nouveau cookie connect.sid est défini, enregistrez-le dans votre nouvel object avec la valeur par défaut false (ce qui signifie que l’utilisateur a été authentifié par session mais pas par connexion).

Sur la connexion de l’utilisateur, envoyez un émetteur de socket au serveur, où vous pourrez ensuite authentifier les informations d’identification de connexion, puis mettre à jour l’object ID de session que vous avez créé pour lire true (connecté) pour l’identifiant de socket actuel.

Maintenant, lors de la réception d’une nouvelle demande http, lisez le cookie.sid et vérifiez si sa valeur dans votre object est true.

Cela devrait ressembler à ceci:

 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 }); }); 

Chris, je ne pourrai pas répondre car je ne suis pas un expert en socket.io, mais je peux peut-être essayer de vous orienter dans une autre direction qui puisse vous aider – et vous faire gagner du temps de développement.

Mais tout d’abord, une clause de non-responsabilité: je travaille pour Realtime.co et je n’essaye pas de faire de la publicité. Je travaille en étroite collaboration avec les développeurs et j’essaie simplement de vous aider en vous fournissant une solution prête à l’emploi pour votre problème. De plus, étant un joueur, je ne peux pas restr à l’écart d’essayer d’aider les gens à sortir leurs jeux!

Realtime utilise une couche d’authentification / autorisation dans laquelle vous pouvez fournir des permissions de lecture / écriture à des canaux sur les canaux. Lorsque les utilisateurs accèdent au site Web, vous pouvez leur donner des permissions en lecture seule sur le canal de jeu. Une fois qu’ils se sont connectés, vous pouvez leur donner des permissions d’écriture. Cela peut être facilement fait en postant une authentification et en se reconnectant au serveur (tout peut être fait côté client). Je le ferais côté serveur, cependant, pour augmenter la sécurité.

Realtime possède une API Node.js qui vous permet de l’intégrer facilement à votre serveur. Comme il possède également des API pour de nombreuses autres plates-formes (y compris mobiles) et qu’elles fonctionnent toutes de la même manière, vous pouvez réellement faire fonctionner votre jeu sur plusieurs plates-formes sur la même couche de communication, tout en contrôlant entièrement les canaux.

Merci d’avoir lu.

Modifier:

Vous pouvez lire la documentation ici pour plus d’infos: http://docs.xrtml.org/