Dimutakhirkan 2x
Jawaban singkat: Tidak, hanya bidang jalur dan protokol yang dapat ditentukan.
Jawaban yang lebih panjang:
Tidak ada metode dalam JavaScript WebSockets API untuk menentukan header tambahan untuk dikirim oleh klien / browser. Jalur HTTP ("GET / xyz") dan header protokol ("Sec-WebSocket-Protocol") dapat ditentukan dalam konstruktor WebSocket.
Header Sec-WebSocket-Protocol (yang terkadang diperluas untuk digunakan dalam otentikasi spesifik websocket) dihasilkan dari argumen kedua opsional ke konstruktor WebSocket:
var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);
Hasil di atas dalam tajuk berikut:
Sec-WebSocket-Protocol: protocol
dan
Sec-WebSocket-Protocol: protocol1, protocol2
Pola umum untuk mencapai otentikasi / otorisasi WebSocket adalah menerapkan sistem tiket di mana halaman yang menampung klien WebSocket meminta tiket dari server dan kemudian melewati tiket ini selama pengaturan koneksi WebSocket baik dalam URL / kueri string, di bidang protokol, atau diperlukan sebagai pesan pertama setelah koneksi dibuat. Server kemudian hanya memungkinkan koneksi untuk melanjutkan jika tiket valid (ada, belum pernah digunakan, IP klien disandikan dalam pertandingan tiket, timestamp dalam tiket baru-baru ini, dll). Berikut ini ringkasan informasi keamanan WebSocket: https://devcenter.heroku.com/articles/websocket-security
Otentikasi dasar sebelumnya merupakan opsi tetapi ini sudah usang dan browser modern tidak mengirim header bahkan jika itu ditentukan.
Info Auth Dasar (Usang) :
Header Otorisasi dihasilkan dari bidang nama pengguna dan kata sandi (atau hanya nama pengguna) dari WebSocket URI:
var ws = new WebSocket("ws://username:password@example.com")
Hasil di atas dalam tajuk berikut dengan string "nama pengguna: kata sandi" base64 disandikan:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Saya telah menguji otentikasi dasar di Chrome 55 dan Firefox 50 dan memverifikasi bahwa info otentikasi dasar memang dinegosiasikan dengan server (ini mungkin tidak berfungsi di Safari).
Terima kasih kepada Dmitry Frank atas jawaban auth dasar