อัปเดต 2x
คำตอบสั้น ๆ : ไม่สามารถระบุได้เฉพาะเส้นทางและเขตข้อมูลโปรโตคอล
คำตอบอีกต่อไป:
ไม่มีวิธีใน JavaScript WebSockets APIสำหรับระบุส่วนหัวเพิ่มเติมสำหรับไคลเอนต์ / เบราว์เซอร์ที่จะส่ง เส้นทาง HTTP ("GET / xyz") และส่วนหัวของโปรโตคอล ("Sec-WebSocket-Protocol") สามารถระบุได้ในตัวสร้าง WebSocket
ส่วนหัว Sec-WebSocket-Protocol (ซึ่งบางครั้งมีการขยายเพื่อใช้ในการรับรองความถูกต้องเฉพาะของ websocket) ถูกสร้างขึ้นจากอาร์กิวเมนต์ตัวเลือกที่สองไปยังตัวสร้าง WebSocket:
var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);
ผลลัพธ์ข้างต้นในส่วนหัวต่อไปนี้:
Sec-WebSocket-Protocol: protocol
และ
Sec-WebSocket-Protocol: protocol1, protocol2
รูปแบบทั่วไปสำหรับการบรรลุการรับรองความถูกต้อง / การอนุญาต WebSocket คือการใช้ระบบตั๋วที่หน้าโฮสต์ไคลเอ็นต์ WebSocket ร้องขอตั๋วจากเซิร์ฟเวอร์จากนั้นส่งตั๋วนี้ระหว่างการตั้งค่าการเชื่อมต่อ WebSocket ทั้งในสตริง URL / แบบสอบถามในฟิลด์โปรโตคอล หรือจำเป็นต้องเป็นข้อความแรกหลังจากการเชื่อมต่อถูกสร้างขึ้น เซิร์ฟเวอร์อนุญาตให้ทำการเชื่อมต่อต่อไปได้หากตั๋วถูกต้อง (มีอยู่, ไม่ได้ใช้งาน, มีการเข้ารหัส IP ไคลเอ็นต์ในการจับคู่ตั๋ว, ประทับเวลาในตั๋วเป็นล่าสุด ฯลฯ ) นี่คือบทสรุปของข้อมูลความปลอดภัย WebSocket: https://devcenter.heroku.com/articles/websocket-security
การรับรองความถูกต้องพื้นฐานเคยเป็นตัวเลือก แต่สิ่งนี้เลิกใช้แล้วและเบราว์เซอร์สมัยใหม่จะไม่ส่งส่วนหัวแม้ว่าจะระบุไว้ก็ตาม
ข้อมูลรับรองความถูกต้องพื้นฐาน (คัดค้าน) :
ส่วนหัวการให้สิทธิ์ถูกสร้างขึ้นจากฟิลด์ชื่อผู้ใช้และรหัสผ่าน (หรือเพียงแค่ชื่อผู้ใช้) ของ WebSocket URI:
var ws = new WebSocket("ws://username:password@example.com")
ผลลัพธ์ข้างต้นในส่วนหัวต่อไปนี้ด้วยสตริง "ชื่อผู้ใช้: รหัสผ่าน" base64 ที่เข้ารหัส:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
ฉันได้ทดสอบการรับรองความถูกต้องเบื้องต้นใน Chrome 55 และ Firefox 50 แล้วและตรวจสอบว่าข้อมูลการรับรองความถูกต้องเบื้องต้นนั้นมีการเจรจากับเซิร์ฟเวอร์ (ซึ่งอาจไม่ทำงานใน Safari)
ขอบคุณ Dmitry Frank สำหรับคำตอบการตรวจสอบขั้นพื้นฐาน