Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript EventSource/SSE(服务器发送的事件)-安全性_Javascript_Html_Security_Server Sent Events - Fatal编程技术网

Javascript EventSource/SSE(服务器发送的事件)-安全性

Javascript EventSource/SSE(服务器发送的事件)-安全性,javascript,html,security,server-sent-events,Javascript,Html,Security,Server Sent Events,我遵循了这个思路,但我还没有完全理解我的问题的答案,我想再发一次 我在前端使用EventSource,后端使用event将数据流传输到我的应用程序中 var source = new EventSource(`blabla:3000/sse?channel=myProject${projectID}`); source.addEventListener(`myDrone${droneID}`, function(e){ console.log('Received an update me

我遵循了这个思路,但我还没有完全理解我的问题的答案,我想再发一次

我在前端使用EventSource,后端使用event将数据流传输到我的应用程序中

var source = new EventSource(`blabla:3000/sse?channel=myProject${projectID}`);
source.addEventListener(`myDrone${droneID}`, function(e){
    console.log('Received an update message:', e.data);
});
在后端,默认情况下没有任何内容是流式传输,并且连接的用户将请求后端开始发送事件。此呼叫使用
jwt\u令牌
进行保护。因此,要使服务器启动流,需要一个令牌

我的问题是,当服务器已经在流式传输时

假设我是一个未连接的用户(因此没有有效的令牌),我决定连接到SSE流,因为我知道通道名称,并且服务器已经在流。如果我在
blablabla:3000/sse?channel=myProject${projectd}
上启动一个新的EventSource。我还能看到通过这个频道发送的所有信息吗?我相信是的

如何确保仅在注册用户上传输这些事件

例:(自上而下读取)

如何防止知道channelName的用户通过服务器接收所有事件流


由于前端和后端目前托管在同一个域上,但这可能会改变,所以我需要一个广泛的答案

这取决于您如何设置SSE服务器,以及您是否在寻找经过身份验证的用户。您需要配置echo服务器,以便使用Go的http.Handler处理身份验证

一旦您这样做了,那么不管您是否知道频道名称和服务器,后端仍然可以拒绝向没有令牌的用户发送消息。不要将其视为用于创建通道的令牌,而应将其视为所需的订阅请求,然后根据请求是否经过身份验证,服务将允许或拒绝。推送服务应对所有订阅请求持续执行此操作

服务器是身份验证时令牌的问题所在,一旦您收到密钥,您可以通过将令牌作为名为“key”的querystring参数附加,让服务器知道您已注册,或者您可以在请求中提供头。以下是方法:

var key ='xVLyHw.HSvCPg:d1RaNTqnY3s4EZZh';
var url ='https://realtime.ably.io/event-stream?channels=myChannel&v=1.1&key=' + key;
var eventSource = new EventSource(url);

eventSource.onmessage = function(event) {
  var message = JSON.parse(event.data);
  console.log('Message: ' + message.name + ' - ' + message.data);
};
示例取自:

您还可以接收一个身份验证令牌,并将其传递到“accessToken”查询字符串中—类似于上面示例中使用密钥的方式。但是请注意,你可以直接复制并把这把钥匙交给任何人,然后他们可以收听同一频道。您还可以将身份验证令牌保存到localstorage中,并将其作为标头传递。您可以使用此库来实现以下目标:

var EventSource = EventSourcePolyfill; 
const eventSource = new EventSource(`blabla:3000/sse?channel=myProject${projectID}`,{
  headers: {
    'Authorization': 'my secret jwt token' // or localStorage.getItem("myToken")
  }
});
添加标题的库位于以下位置:

或者,您可以使用可以生成cookie的基本身份验证,并通过设置withCredentials=true发送订阅请求:

var source = new EventSource(`blabla:3000/sse?channel=myProject${projectID}`, { withCredentials: true });

您能否扩展到“当服务器已在流式传输时,如果我是未连接的服务器”。每个流都专用于SSE中的一个连接,因此连接和流总是一起进行的。但我认为您可能在谈论一些不同的内容?当客户端连接到通道时,服务器将在通道上启动一个流,并保持流,直到所有主机断开连接。在该阶段,将进行身份验证检查。但一旦频道打开,服务器开始播放流媒体,我相信任何人都有可能用正确的频道名称打开SSE连接并收听所有信息。我认为如果你能用显示组件和数据流的图表更新你的问题,可能会有所帮助。@Bobby你在使用
https://github.com/EventSource/eventsource
?我正在使用我看到的本机,谢谢,因此,基本上,最好的方法是在我执行
neweventsource
时传递令牌,然后基于此打开或不打开连接。如果连接被拒绝,即使服务器正在对消息进行流式传输,客户端也无法接收任何消息,因为消息未被
广播。所以最后,我可以像其他任何普通的httpCall一样,你仍然可以广播,如果你愿意的话,这取决于你的配置,但不管怎样,是的,你可以将其视为普通的httpCall,请求仍将受到您提供的令牌的保护-因为您的服务器需要某种身份验证设置。很抱歉,我尝试在eventsource上添加标头,但它显示了类型为“{headers:{Authorization:string;};”的
参数'不可分配给'EventSourceInit'类型的参数。
EventSourceInit只是这样一个对象
interface EventSourceInit{withCredentials?:boolean;}
是否使用了Yaffle polyfill?