Les en-têtes HTTP dans les Websockets client API
Dirait qu'il est facile d'ajouter des en-têtes HTTP personnalisés à votre client websocket avec n'importe quel en-tête HTTP client qui prend en charge ce, mais je ne trouve pas comment le faire avec l'API JSON.
Pourtant, il semble qu'il devrait y avoir un soutien ces en-têtes dans la spec.
Quelqu'un a une idée sur comment faire?
var ws = new WebSocket("ws://example.com/service");
Plus précisément, j'ai besoin d'être en mesure d'envoyer un HTTP en-tête d'Autorisation.
- Je pense qu'une bonne solution est de permettre à la WebSocket pour se connecter sans autorisation, mais ensuite, bloquer et d'attendre sur le serveur pour recevoir l'autorisation de la webSocket qui transmet les informations d'autorisation en son événement onopen.
- La suggestion de @Motes semble être le meilleur ajustement. Il était très facile de faire une autorisation d'appel de onOpen qui vous permet d'accepter ou de rejeter la prise basé sur l'autorisation de la réponse. J'ai d'abord tenté l'envoi de jeton d'authentification dans la Sec-WebSocket-en-tête de Protocole, mais qui se sent comme un hack.
Vous devez vous connecter pour publier un commentaire.
Mis à jour 2x
Réponse courte: Pas, seulement le chemin et le champ de protocole peut être spécifié.
Plus réponse:
Il n'y a pas de méthode dans le code JavaScript, Les WebSockets API pour la spécification des en-têtes supplémentaires pour le client/navigateur pour envoyer. Le chemin d'accès HTTP ("GET /xyz") et le protocole de l'en-tête (ou"Sec-WebSocket-Protocole") peut être spécifié dans le WebSocket constructeur.
La Sec-WebSocket-en-tête de Protocole (qui est parfois étendue à être utilisés dans les websocket d'authentification spécifique) est généré à partir de la deuxième argument optionnel de la WebSocket constructeur:
Les résultats ci-dessus dans les en-têtes suivants:
et
Un modèle commun pour la réalisation de WebSocket d'authentification/autorisation est de mettre en place un système de billetterie où la page hébergeant le WebSocket client demande un ticket de du serveur, puis passe ce billet en cours de connexion WebSocket le programme d'installation dans l'URL/chaîne de requête, dans le champ protocole, ou que le premier message après que la connexion est établie. Ensuite, le serveur ne permet que la connexion si le billet est valide (il existe, n'a pas été déjà utilisé, l'adresse IP du client codées dans le billet matches, l'horodatage dans le billet est récente, etc). Voici un résumé de WebSocket de la sécurité de l'information: https://devcenter.heroku.com/articles/websocket-security
L'authentification de base était autrefois une option, mais elle est obsolète et navigateurs modernes ne pas envoyer l'en-tête, même si elle est spécifiée.
Basic Auth Info (Obsolète):
L'en-tête d'Autorisation est généré à partir du nom d'utilisateur et le mot de passe (ou tout simplement le nom d'utilisateur) domaine de la WebSocket URI:
Les résultats ci-dessus dans la suite de l'en-tête avec la chaîne "nom d'utilisateur:mot de passe" base64:
J'ai testé l'authentification basique de Chrome 55 et Firefox 50 et vérifié que le basic auth info est en effet négocié avec le serveur (cela peut ne pas fonctionner dans Safari).
Grâce à Dimitri Frank pour le basic auth réponse
ws://username:[email protected]
ce modèle ne fonctionne pas sous Safari, mais fonctionne dans chrome, ffWebSocket: Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received
erreur.HTTP en-tête d'Autorisation problème peut être résolu avec les éléments suivants:
Ensuite, une bonne Base de l'Autorisation en-tête HTTP de la condition
username
etpassword
. Si vous avez besoin d'Autorisation de Base, alors vous êtes tous ensemble.Je veux utiliser
Bearer
cependant, et j'ai eu recours à l'astuce suivante: - je me connecter au serveur comme suit:Et quand mon code sur le serveur reçoit l'Autorisation de Base de l'en-tête avec les non-vide nom d'utilisateur et mot de passe vide, puis il interprète le nom d'utilisateur comme un jeton.
wss://user:[email protected]/ws
) et n'ai obtenu aucuneAuthorization
en-tête sur le côté serveur (à l'aide de la version Chrome 60)wss://user:pass@host
format. Ce n'est pas pris en charge par les navigateurs, ou est-ce que quelque chose va mal avec la poignée de main?http://username:[email protected]
est amorti. developer.mozilla.org/en-US/docs/Web/HTTP/Authentication. Des thats peut-être la raison pour laquelle cela ne fonctionne pas avec les websockets, soit!Plus d'une solution alternative, mais tous les navigateurs modernes envoyer le domaine des cookies avec la connexion, donc à l'aide de:
Jusqu'à la fin avec la demande d'en-têtes de connexion:
Vous ne pouvez pas ajouter des en-têtes, mais, si vous avez juste besoin de passer des valeurs pour le serveur au moment de la connexion, vous pouvez spécifier une partie de chaîne de requête de l'url:
Que l'URL est valide, mais bien - sûr, vous aurez besoin de modifier votre code serveur pour l'analyser.
Vous ne pouvez pas envoyer l'en-tête personnalisé lorsque vous souhaitez établir les WebSockets connexion à l'aide de JavaScript API Websocket.
Vous pouvez utiliser
Subprotocols
en-têtes à l'aide de la deuxième WebSocket constructeur de la classe:et puis vous pouvez obtenir le Subprotocols en-têtes à l'aide de
Sec-WebSocket-Protocol
clé sur le serveur.Il y a aussi une limitation, votre Subprotocols les en-têtes de valeurs ne peut pas contenir une virgule (
,
) !Sec-WebSocket-Protocol
en-tête en tant que suppléant de laAuthorization
en-tête?L'envoi d'en-tête d'Autorisation n'est pas possible.
De la fixation d'un jeton de paramètre de requête est une option. Toutefois, dans certaines circonstances, il peut être souhaitable d'envoyer votre principale jeton de connexion en texte brut comme un paramètre de requête, car il est plus opaque que l'utilisation d'un en-tête et finira par être connecté whoknowswhere. Si cela soulève des préoccupations en matière de sécurité pour vous, une alternative est d'utiliser un secondaire JWT jeton juste pour le web socket trucs.
Créer un point de terminaison REST pour la génération de ce JWT, qui peut bien sur être utilisé par des utilisateurs authentifiés avec votre jeton de connexion (transmis via l'en-tête). Le web socket JWT peut être configuré différemment de votre jeton de connexion, par exemple, avec un court délai, de sorte qu'il est plus sûr d'envoyer une requête de paramètre de votre demande de mise à niveau.
De la création d'un JwtAuthHandler pour le même parcours que vous enregistrez le SockJS eventbusHandler sur. Assurez-vous que votre auth gestionnaire est inscrit en premier, de sorte que vous pouvez vérifier sur le web socket jeton à l'encontre de votre base de données (JWT devrait être en quelque sorte lié à votre utilisateur dans le backend).
Totalement piraté comme ça, grâce à kanaka de réponse.
Client:
Serveur (à l'aide Koa2 dans cet exemple, mais il devrait être similaire où):
Techniquement, vous pourrez envoyer ces en-têtes grâce à la fonction de connexion avant que le protocole de la phase de mise à niveau. Cela a fonctionné pour moi dans un
nodejs
projet:headers
doit être null ou un objet de préciser les autres arbitraire-têtes de requête HTTP à envoyer avec la demande." à partir de WebSocketClient.md; par conséquent, laheaders
voici HTTP couche.connect
méthode, décrite commeconnect(requestUrl, requestedProtocols, [[[origin], headers], requestOptions])
, c'est à dire laheaders
devrait être fourni avecrequestOptions
, par exemple,ws.connect(url, '', headers, null)
. Seul leorigin
chaîne peut être ignoré dans ce cas.