web-dev-qa-db-fra.com

socket.io-client comment définir l'en-tête de la requête lors de la connexion

J'essaie de définir un en-tête http lorsque le client socket.io fait la demande de connexion. Y a-t-il un moyen de faire cela?

Voici ce que je fais:

// server side
var io = socketio(server);

io.use(function (socket, next) {
  // authorize using authorization header in socket.request.headers
});

// client side
var socket = io();  // i'm trying to set an authorization header in this http reqeust

Des idées? Merci.

34
Ziyu

Vous pouvez utiliser l'option extraHeaders , si vous utilisez socket.io-client> = 1.4.

Par exemple:

var socket = io("http://localhost", {
  extraHeaders: {
    Authorization: "Bearer authorization_token_here"
  }
});

engine.io-client , qui est un backend de socket.io-client, a introduit la prise en charge de extraHeaders le 28/11/2015 .

39
ymyzk

Il semble que le le client ne prend pas en charge la définition des en-têtes , car tous les transports ne permettent pas la définition des en-têtes.

This post by facundoolano détaille une solution de contournement à l'authentification qui ne nécessite pas de placer le jeton d'authentification dans la chaîne de requête.

Son module de contournement peut être trouvé à https://github.com/invisiblejs/socketio-auth .

Me fait me demander pourquoi côté serveur, socket.io permet d'accéder aux en-têtes de requête ...

13
bakavic

À partir de la version 2.0.0/2017-01-22 engine.io-client prend en charge

[feature] Allow extraHeaders to be set for browser clients in XHR requests (#519)

Cependant, à ce stade, le socket.io-client n'est pas mis à jour pour prendre en charge cette fonctionnalité, donc quelques jours peuvent mettre fin à cette saga jusqu'à ce moment-là, utilisez les instructions suivantes: https://facundoolano.wordpress.com/2014/10/11/better-authentication-for-socket-io-no-query-strings /

2
Lu4

Ces informations sont obsolètes depuis socket.io 1.0

Il existe deux méthodes d'autorisation: globale ou espace de noms (pensez route). La méthode globale est définie sur le serveur avec l'appel de configuration io.set('authorization', function (handshakeData, callback).

L'objet handshakeData contient les informations suivantes:

{
   headers: req.headers       // <Object> the headers of the request
 , time: (new Date) +''       // <String> date time of the connection
 , address: socket.address()  // <Object> remoteAddress and remotePort object
 , xdomain: !!headers.Origin  // <Boolean> was it a cross domain request?
 , secure: socket.secure      // <Boolean> https connection
 , issued: +date              // <Number> Epoch of when the handshake was created
 , url: request.url          // <String> the entrance path of the request
 , query: data.query          // <Object> the result of url.parse().query or a empty object
}

Les informations ci-dessus et une explication plus approfondie sont disponibles sur ce page de documentation .

1
adamrights