Authentification avec Node / Express / Socket.IO

J’ai un noeud / socket.io / serveur express connecté à un fichier HTML (comme ça ). Donc, visiter l’adresse Web vous connecte au serveur. J’essaie de mettre en place un système où, ledit serveur étant exécuté sur plusieurs ordinateurs à la fois et par une sorte d’authentification de nom d’utilisateur et de mot de passe, visiter la page Web avec des informations d’identification spécifiques vous connecte à l’un des ordinateurs avec ces mêmes informations d’identification exécutant le serveur.

J’ai déjà vu mention de “Redis” dans des questions similaires précédentes, mais ils sont assez vieux et je me demande s’il existe un moyen plus récent ou meilleur d’y parvenir.

    Vous ne trouverez pas beaucoup de documentation à jour, car Express 4 est un peu nouveau, laissez-moi essayer d’y remédier ici:

    Authentification dans Express 4.x et Socket.IO 1.x

    Commençons par une confusion que je pense que vous faites:

    • Qu’est-ce que Redis?

      Redis est un moteur de structure de données. Il vous permet de stocker des paires clé / valeur, rien de plus (dans ce contexte). La seule chose à faire pour vous lors de la construction de votre système d’authentification est de stocker les données, les informations utilisateur, les identifiants de session, etc. Dans votre cas, vous pouvez partager un magasin entre plusieurs ordinateurs, de la même manière que vous partageriez une firebase database. un fichier texte.

      Redis

    • Authentifier l’utilisateur sur le serveur de noeud / express

      Pour ce faire, vous pouvez utiliser un passeport . Passport est un middleware dédié à l’authentification sur Node.js. Il est conçu pour être utilisé avec Express et relativement facile à configurer. Il existe une excellente série de tutoriels sur la procédure de configuration du passeport avec votre application express. Par conséquent, je ne détaillerai pas cette partie. Veuillez prendre le temps de parcourir la série, c’est une connaissance inestimable.

      Voici le lien vers la première partie , celle sur laquelle je me concentrerai pour la prochaine étape.

    • Ajouter socket.io au mix

      Socket.io n’a pas access aux cookies de session que vous avez créés dans la partie 1. Pour remédier à cela, nous allons utiliser le module passport-socketio .

      Passport-socketio nécessite un magasin de session local, par opposition à un magasin de mémoire. Cela signifie que nous avons besoin d’un moyen de stocker les données de la session quelque part. Cela vous dit quelque chose?

      Exactement, Redis .

      Vous pouvez essayer d’autres magasins, comme mongoDB ou MySQL, mais Redis est le plus rapide.

      Dans cet exemple, je suppose que votre application express et votre passeport sont déjà opérationnels et que vous allez vous concentrer sur l’ajout de socket.io à l’application.

    • Installer :

    var session = require('express-session'); //You should already have this line in your app var passportSocketIo = require("passport.socketio"); var io = require("socket.io")(server); var RedisStore = require('connect-redis')(session); var sessionStore = new RedisStore({ // Create a session Store host: 'localhost', port: 6379, }); app.use(session({ store: sessionStore, //tell express to store session info in the Redis store secret: 'mysecret' })); io.use(passportSocketIo.authorize({ //configure socket.io cookieParser: cookieParser, secret: 'mysecret', // make sure it's the same than the one you gave to express store: sessionStore, success: onAuthorizeSuccess, // *optional* callback on success fail: onAuthorizeFail, // *optional* callback on fail/error })); 

    Connect-redis est un package de magasin de session qui utilise redis (au cas où le nom ne soit pas évident).

    • Dernière étape :
     function onAuthorizeSuccess(data, accept){ console.log('successful connection to socket.io'); accept(); //Let the user through } function onAuthorizeFail(data, message, error, accept){ if(error) accept(new Error(message)); console.log('failed connection to socket.io:', message); accept(null, false); } io.sockets.on('connection', function(socket) { console.log(socket.request.user); }); 

    L’object utilisateur se trouvant dans socket.request contiendra toutes les informations sur l’utilisateur de l’utilisateur connecté. Vous pouvez le transmettre ou faire tout ce dont vous avez besoin à partir de ce point.

    Remarque: cette configuration sera légèrement différente pour Socket.IO <1.x.