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