Il y a deux façons de procéder.
L'un des moyens consiste à permettre à quiconque d'ouvrir une connexion websocket. Demandez au client d'envoyer un jeton d'autorisation comme premier message après l'ouverture de la connexion. Si le client n'envoie pas un jeton valide dans un certain délai, fermez la connexion.
Une autre solution consiste à utiliser des cookies (ils sont envoyés automatiquement par le navigateur à chaque demande). Cela nécessite de mettre en place une protection CSRF (encore plus que la normale, car il n'existe pas de politique de même origine (SOP) pour les websockets. Vous pouvez trouver des détails ici . Le plan est le suivant :
- faire une requête "websocket preauth" vers le backend depuis js en utilisant l'authentification normale du site
- renvoie un jeton CSRF dans le corps de la réponse et définit un cookie "websocket auth" avec
SameSite=Strict
dans les en-têtes de la réponse
- tentative d'établir une connexion websocket avec le backend, avec l'ajout du jeton CSRF dans un paramètre de requête
- le backend vérifie
- que le cookie d'authentification websocket et le jeton CSRF sont valides.
- que la valeur de la
Origin
correspond à un domaine approuvé
- le backend envoie une réponse et met à niveau la connexion pour utiliser des websockets
La première méthode est plus simple, mais elle présente l'inconvénient d'exiger que vous ayez un certain état côté serveur en attendant que le client s'authentifie. Cela peut permettre à un attaquant de réaliser une attaque par déni de service en consommant toutes les sockets disponibles.