[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 ajouter d'en-têtes mais, si vous avez juste besoin de transmettre des valeurs au serveur au moment de la connexion, vous pouvez spécifier une partie de chaîne de requête sur l'URL:

var ws = new WebSocket("ws://example.com/service?key1=value1&key2=value2");

Cette URL est valide mais - bien sûr - vous devrez modifier votre code serveur pour l'analyser.




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...