EventSource และการรับรองความถูกต้อง http พื้นฐาน

ไม่มีใครรู้ว่าเป็นไปได้หรือไม่ที่จะส่งข้อมูลรับรองความถูกต้อง http พื้นฐานกับ EventSource


person Miloš Rašić    schedule 08.07.2011    source แหล่งที่มา


คำตอบ (5)


EventSource เป็นเรื่องเกี่ยวกับเซิร์ฟเวอร์ที่ส่งเหตุการณ์ไปยังไคลเอนต์ ฉันคิดว่าคุณต้องการการสื่อสารแบบสองทิศทางเพื่อการรับรองความถูกต้อง คุณจะส่งข้อมูลประจำตัวจริงอย่างไร

อย่างไรก็ตาม WebSockets สามารถบรรลุเป้าหมายนั้นได้ นั่นคือสิ่งที่ที่คุณกำลังมองหา?

อัปเดต:

คุณสามารถบรรลุสิ่งที่คุณต้องการได้โดยใช้คุกกี้ ตามที่ระบุโดย 4esn0k คุกกี้จะถูกส่งไปพร้อมกับคำขอเริ่มต้นที่เบราว์เซอร์ทำเพื่อสร้างการเชื่อมต่อ ดังนั้น เพียงตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าตัวระบุเซสชันสำหรับคุกกี้ก่อนที่จะเปิดใช้งานการเชื่อมต่อ EventSource ใดๆ

person Tower    schedule 08.07.2011
comment
EventSource ต้องเริ่มต้นการเชื่อมต่อและดูแลให้เปิดอยู่เสมอ ไม่ว่าจะโดยการไม่ปิดหากเซิร์ฟเวอร์ไม่ได้ปิด หรือพยายามสร้างใหม่อย่างไม่มีกำหนดหากเซิร์ฟเวอร์ถูกปิด ไม่ว่าจะด้วยวิธีใด EventSource ต้องทำขั้นตอนแรกในการเชื่อมต่อ EventSource เหมาะสำหรับจุดประสงค์ของฉัน แต่ฉันต้องการให้ส่งข้อมูลการตรวจสอบสิทธิ์เมื่อทำการร้องขอ - person Miloš Rašić; 11.07.2011
comment
ตามข้อกำหนด (dev.w3.org/html5/eventsource) ไม่มี ฉันเกรงว่าจะส่งหนังสือรับรองเหล่านั้นไปได้อย่างไร - person Tower; 12.07.2011
comment
@ทาวเวอร์ ฉันไม่เห็นด้วย EventSource เป็นเพียงคำขอ http ที่ยังคงอยู่และมีประเภทเนื้อหาเป็น 'text/event-stream' คุณสามารถส่งคุกกี้เป็นคำขอ http อื่น ๆ (สมมติว่าคุณได้รับการรับรองความถูกต้องแล้ว) หรือคุณสามารถส่งข้อมูลรับรองผ่านสตริงการสืบค้น - person saml; 12.12.2013

ฉันกำลังมองหาวิธีแก้ไขปัญหาเดียวกัน โพสต์นี้ ที่นี่ บอกว่า:

ข้อแม้อีกประการหนึ่งคือ เท่าที่เราทราบ คุณไม่สามารถเปลี่ยนส่วนหัว HTTP ได้เมื่อใช้ EventSource ซึ่งหมายความว่าคุณต้องส่งพารามิเตอร์สตริงการสืบค้นการอนุญาตพร้อมค่าที่คุณจะแทรกโดยใช้ HTTP Basic Auth: การต่อข้อมูลแบบเข้ารหัส base64 ของคุณ เข้าสู่ระบบและโทเค็น

นี่คือรหัสจากโพสต์:

// First, we create the event source object, using the right URL.
var url = "https://stream.superfeedr.com/?";
url += "&hub.mode=retrieve";
url += "&hub.topic=http%3A%2F%2Fpush-pub.appspot.com%2Ffeed";
url += "&authorization=anVsaWVuOjJkNTVjNDhjMDY5MmIzZWFkMjA4NDFiMGViZDVlYzM5";

var source = new EventSource(url);

// When the socket has been open, let's cleanup the UI.
source.onopen = function () {
  var node = document.getElementById('sse-feed');
  while (node.hasChildNodes()) {
    node.removeChild(node.lastChild);
  }
};

// Superfeedr will trigger 'notification' events, which corresponds
// exactly to the data sent to your subscription endpoint 
// (webhook or XMPP JID), with a JSON payload by default.
source.addEventListener("notification", function(e) {
  var notification = JSON.parse(e.data);
  notification.items.sort(function(x, y) {
    return x.published - y.published;
  });
  notification.items.forEach(function(i) {
    var node = document.getElementById('sse-feed');
    var item = document.createElement("li");
    var t = document.createTextNode([new Date(i.published * 1000), i.title, i.content].join(' '));
    item.appendChild(t);
    node.insertBefore(item, node.firstChild);
    // We add the element to the UI.
  });
});

person k427h1c    schedule 27.03.2015

หากคุณพูดถึงคุกกี้ (ไม่ใช่ http auth):

EventSource ใช้ http ดังนั้นคุกกี้จึงถูกส่งไปพร้อมกับคำขอเชื่อมต่อ EventSource

ควรรองรับ Http auth เช่นเดียวกับ http url อื่นๆ แม้ว่าจะไม่รองรับจาก spec CORS+http auth ก็ตาม

person 4esn0k    schedule 07.10.2011

ปัจจุบันมีแพ็คเกจ NPM สำหรับเปลี่ยน HTTP Header

https://www.npmjs.com/package/eventsource

ไลบรารีนี้เป็นการนำ JavaScript ไปใช้จริงของไคลเอ็นต์ EventSource API มีเป้าหมายที่จะเข้ากันได้กับ W3C

คุณสามารถใช้กับ Node.js หรือเป็น polyfill ของเบราว์เซอร์สำหรับเบราว์เซอร์ที่ไม่รองรับ EventSource ดั้งเดิม

person Alisson Gomes    schedule 01.05.2020

คุณสามารถใช้ event-source-polyfill เพื่อเพิ่มส่วนหัวเช่นนี้

import { EventSourcePolyfill } from 'event-source-polyfill';

new EventSourcePolyfill(`/api/liveUpdate`, {
  headers: {
    Authorization: `Bearer 12345`,
    'x-csrf-token': `xxx-xxx-xxx`,
  },
});
person RousseauAlexandre    schedule 05.05.2021