Skip to content
On this page

Middlewares

Tout comme pour la librairie Express.js, il est possible d'utiliser un Middleware.

Un middleware est une fonction qui va intercepter une requête WebSocket, et dont la logique peut conduire à deux résultats : soit la requête continue et est donc traitée par un autre Middleware ou un écouteur d'événement, soit une erreur est levée, et le client peut alors la traiter.

Côté serveur

Un Middleware ne peut pas être créé côté client, vous ne pouvez ajouter un Middleware que sur le côté serveur.

Pour cela, il suffit d'appeler la méthode io.use, similaire à la méthode server.use avec la libriarie Express.js. Une fois cela fait, vous pouvez appeler la fonction next afin de pouvoir passer à la fonction de traitement de la requête suivante.

typescript
import { Server } from "socket.io";

const io = new Server(9000);

io.use((socket, next) => {
  next();
});

io.on("connection", () => {
  console.log("Nouvelle connexion");
});

Pour pouvoir lever une exception et arrêter le trajet de la requête WebSocket, il est possible de lever une exception dans l'appel de la fonction next.

typescript
import { Server } from "socket.io";

const io = new Server(9000);

io.use((socket, next) => {
  next(new Error("Quelque chose s'est mal passé"));
});

io.on("connection", () => {
  console.log("Nouvelle connexion");
});

Authentification

Un Middleware est très utile notamment pour ajouter un système de log des requêtes WebSocket par exemple, pour ralentir les requêtes (Rate Limiting) ou encore pour ajouter une couche d'authentification entre le client et le serveur.

Pour pouvoir authentifier une requête, il est possible d'utiliser la propriété socket.auth.token afin de pouvoir par exemple passer un jeton d'authentification envoyé par le client.

Pour pouvoir récupérer cela côté serveur, voici le code en question.

typescript
import { Server } from "socket.io";

function checkAuth(token) {
  console.log("Vérifier l'authentification ici");

  return false;
}

const io = new Server(9000);

io.use((socket, next) => {
  const token = socket.handshake.auth.token;
  const isAuthenticated = checkAuth(token);

  if (isAuthenticated) {
    next();
    return;
  }

  next(new Error("Pas authentifié"));
});

io.on("connection", () => {
  console.log("Nouvelle connexion");
});

Côté client, il faut initialiser la connection WebSocket en appelant la fonction io et en passant en second argument en option le jeton d'authentification. C'est donc une bonne idée de connecter votre utilisateur avant d'initialiser la connexion WebSocket.

typescript
import { io } from "socket.io-client";

const socket = io("ws://share.finances.com/apple", {
  auth: {
    token: "..."
  }
});

socket.emit("message", "Hello, world!");

Il est également possible de récupérer les éventuelles erreur via la méthode emit et le deuxième argument.

typescript
import { io } from "socket.io-client";

const socket = io("ws://share.finances.com/apple", {
  auth: {
    token: "..."
  }
});

socket.emit("message", "Hello, world!", error => {
  if (error) {
    console.error("Probablement une erreur d'authentification");
    console.error(error);
  }
});