2014-05-01 13 views
23

Próbuję ustawić nagłówek http, gdy klient socket.io wyśle ​​żądanie połączenia. Czy jest jakiś sposób na zrobienie tego?socket.io-client jak ustawić nagłówek żądania podczas tworzenia połączenia

Oto co robię:

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

pomysłów? Dzięki.

+0

Kiedy klient gniazda wysyła żądanie, ma już z nim nagłówki żądania. Mówisz, że chcesz je zmienić lub chcesz tylko wysłać jakieś tokeny z klienta gniazda i na podstawie tych tokenów, które chcesz autoryzować klienta ???? –

+0

Chcę wysłać token w nagłówku. @MOmayr – Ziyu

+0

możesz wysłać ten token w ciągu zapytania i sprawdzić go w funkcji autoryzacji. Czy powinienem dać ci przykład? –

Odpowiedz

-3

Informacja ta została zaniechana od socket.io 1,0

Istnieją dwie metody autoryzacji: globalne lub nazw (myślę trasy). Globalna metoda jest ustawiana na serwerze za pomocą wywołania konfiguracyjnego io.set('authorization', function (handshakeData, callback).

handshakeData obiekt zawiera następujące informacje:

{ 
    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 
} 

Powyższe informacje i głębsze wyjaśnienie jest dostępne na tej documentation page.

+1

'io.set ('authorization')' faktycznie został uznany za przestarzały w wersji 1.0: http://socket.io/docs/migrating-from-0-9/ –

11

Wygląda na to, że client doesn't support setting headers, ponieważ nie wszystkie transporty pozwalają na ustawienie nagłówków.

Ten plik post od facundoolano określa sposób obejścia uwierzytelniania, który nie wymaga umieszczania tokenu uwierzytelnienia w ciągu zapytania.

Jego moduł obejścia można znaleźć pod adresem https://github.com/invisiblejs/socketio-auth.

Sprawia, że ​​zastanawiam się, dlaczego na stronie serwera, socket.io pozwala na nagłówki żądania, aby uzyskać dostęp ...

+0

Uścisk dłoni Socket.io (nawet dla WebSockets) zaczyna się od regularnego RESTU wywołanie i dalsza elewacja do protokołu WebSocket, więc odpowiedź wydaje się błędna, z drugiej strony, jeśli używasz nagłówków żądań HTTP, to powinno działać dobrze ... – Lu4

22

Można użyć extraHeaders opcję, jeśli używasz socket.io-client> = 1.4.

Na przykład:

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

engine.io-client, który jest backend z socket.io-client, introduced extraHeaders support on 2015-11-28.

+8

Chociaż wydaje się, że jest to świetna opcja, działa przy korzystaniu z klienta NodeJS , ale nie w przeglądarce. Stwierdza to w czytanym mnie, prawdopodobnie b/c pierwszego linku w odpowiedzi bakavica powyżej (nie wszystkie transporty pozwalają na ustawienie niestandardowych nagłówków) –

+0

Nie było obsługiwane w niektórych przeglądarkach od wczoraj z powodu błędu , Naprawiłem to :) – Lu4

+2

Awesome, w jaki sposób otrzymujesz nagłówki po stronie serwera? – TheJKFever