[javascript] En-têtes HTTP dans l'API client Websockets



Answers

Le problème d'en-tête d'autorisation HTTP peut être résolu avec les éléments suivants:

var ws = new WebSocket("ws://username:password@example.com/service");

Ensuite, un en-tête HTTP Basic Authorization approprié sera défini avec le username et le password fournis. Si vous avez besoin d'une autorisation de base, vous êtes tous définis.

Je veux cependant utiliser Bearer , et j'ai eu recours à l'astuce suivante: Je me connecte au serveur comme suit:

var ws = new WebSocket("ws://my_token@example.com/service");

Et lorsque mon code côté serveur reçoit l'en-tête Basic Authorization avec un nom d'utilisateur non vide et un mot de passe vide, il interprète le nom d'utilisateur comme un jeton.

Question

On dirait qu'il est facile d'ajouter des en-têtes HTTP personnalisés à votre client websocket avec n'importe quel client d'en-tête HTTP qui supporte cela, mais je ne peux pas trouver comment le faire avec l'API JSON.

Pourtant, il semble qu'il devrait y avoir un soutien ces en-têtes dans la spécification .

Quelqu'un a une idée sur la façon de le réaliser?

var ws = new WebSocket("ws://example.com/service");

Plus précisément, je dois être en mesure d'envoyer un en-tête d'autorisation HTTP.




Vous ne pouvez pas envoyer d'en-tête personnalisé lorsque vous souhaitez établir une connexion WebSockets à l'aide de l'API JavaScript WebSockets. Vous pouvez utiliser les en Subprotocols têtes Subprotocols en utilisant le deuxième constructeur de classe WebSocket:

var ws = new WebSocket("ws://example.com/service", "soap");

puis vous pouvez obtenir les en-têtes Subprotocols à l'aide de la clé Sec-WebSocket-Protocol sur le serveur.

Il y a aussi une limitation, vos valeurs d'en-têtes Subprotocols ne peuvent pas contenir de virgule ( , )!




Totalement piraté comme ça, grâce à la réponse de Kanaka.

Client:

var ws = new WebSocket(
    'ws://localhost:8080/connect/' + this.state.room.id, 
    store('token') || cookie('token') 
);

Serveur (en utilisant Koa2 dans cet exemple, mais devrait être similaire partout):

var url = ctx.websocket.upgradeReq.url; // can use to get url/query params
var authToken = ctx.websocket.upgradeReq.headers['sec-websocket-protocol'];
// Can then decode the auth token and do any session/user stuff...



Links