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

问题描述 投票:0回答:1

[我关注了This线程,但由于我尚未完全理解我的情况,我想再次发表。

我在前端使用EventSource,后端在使用echo事件将与无人机相关的数据流式传输到我的应用程序。

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_token进行保护。因此,要使服务器启动流,需要令牌。

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

假设我没有连接(因此没有有效的令牌),我决定连接到SSE流,因为我知道通道名称并且服务器已经在流传输。如果我在blabla:3000/sse?channel=myProject${projectID}上启动新的EventSource。我仍然可以看到通过此频道发送的所有消息吗?我相信是的。

如何确保流式传输的事件仅适用于注册用户?

例如:(从上至下阅读)

enter image description here

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

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

javascript html security server-sent-events
1个回答
0
投票

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

配置回显服务器以处理身份验证

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

服务器是身份验证时令牌的问题,一旦收到密钥,您可以通过将令牌作为名为“ key”的查询字符串参数附加到服务器,以使服务器知道您已注册,或者可以提供标头在您的要求内。方法如下:

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);
};

示例取自:https://www.ably.io/documentation/sse

您还可以收到一个auth令牌,您可以将其传递到您的“ accessToken”查询字符串中-类似于在上面的示例中使用密钥的方式。但请注意,您可以按原样复制此密钥并将其提供给在那里的任何人,然后他们可以收听同一频道。您还可以将auth令牌保存到localstorage中,并将其作为标头传递。您可以使用此库来实现此目的:

var EventSource = EventSourcePolyfill; 
const eventSource = new EventSource(`blabla:3000/sse?channel=myProject${projectID}`,{
  headers: {
    'Authorization': 'my secret jwt token' // or localStorage.getItem("myToken")
  }
});

在此处可以找到添加标题的库:https://github.com/Yaffle/EventSource

或者您可以使用可以生成Cookie的基本身份验证,并通过设置withCredentials = true来发送与Cookie一起进行订阅的请求:>

var source = new EventSource(`blabla:3000/sse?channel=myProject${projectID}`, { withCredentials: true });
© www.soinside.com 2019 - 2024. All rights reserved.