Zaktualizowano 2x
Krótka odpowiedź: Nie, można podać tylko pole ścieżki i protokołu.
Dłuższa odpowiedź:
W interfejsie API JavaScript WebSockets nie ma metody określania dodatkowych nagłówków do wysłania przez klienta / przeglądarkę. Ścieżka HTTP („GET / xyz”) i nagłówek protokołu („Sec-WebSocket-Protocol”) można określić w konstruktorze WebSocket.
Nagłówek Sec-WebSocket-Protocol (który czasem jest rozszerzony do użycia w uwierzytelnianiu specyficznym dla websocket) jest generowany z opcjonalnego drugiego argumentu do konstruktora WebSocket:
var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);
Powyższe skutkuje następującymi nagłówkami:
Sec-WebSocket-Protocol: protocol
i
Sec-WebSocket-Protocol: protocol1, protocol2
Częstym wzorcem uzyskiwania uwierzytelnienia / autoryzacji WebSocket jest wdrożenie systemu biletowego, w którym strona hostująca klienta WebSocket żąda biletu od serwera, a następnie przekazuje ten bilet podczas konfiguracji połączenia WebSocket albo w ciągu adresu URL / zapytania, w polu protokołu, lub wymagany jako pierwszy komunikat po nawiązaniu połączenia. Serwer pozwala wtedy na kontynuowanie połączenia tylko wtedy, gdy bilet jest ważny (istnieje, nie był już używany, adres IP klienta zakodowany w dopasowaniu biletu, znacznik czasu w bilecie jest aktualny itp.). Oto podsumowanie informacji o bezpieczeństwie WebSocket: https://devcenter.heroku.com/articles/websocket-security
Podstawowe uwierzytelnianie było wcześniej opcją, ale było przestarzałe, a nowoczesne przeglądarki nie wysyłają nagłówka, nawet jeśli jest określony.
Podstawowe informacje uwierzytelniające (wycofane) :
Nagłówek autoryzacji jest generowany z pola nazwy użytkownika i hasła (lub tylko nazwy użytkownika) identyfikatora URI WebSocket:
var ws = new WebSocket("ws://username:password@example.com")
Powyższe powoduje powstanie następującego nagłówka z ciągiem „nazwa użytkownika: hasło” zakodowanym base64:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Przetestowałem podstawowe uwierzytelnianie w Chrome 55 i Firefox 50 i zweryfikowałem, że podstawowe informacje o uwierzytelnianiu są rzeczywiście negocjowane z serwerem (może to nie działać w przeglądarce Safari).
Podziękowania dla Dmitry'ego Franka za podstawową odpowiedź na autoryzację