EventSource / SSE (Server-Sent-Events) - Безопасность - PullRequest
0 голосов
/ 19 марта 2020

Я следовал Это Тема, но я, поскольку я не до конца понял ответ в моем случае, я хотел бы опубликовать снова.

Я использую EventSource в своем Front-End и Backend использует событие 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);
});

В backend по умолчанию ничего не передается, и пользователь при соединении запросит на сервер, чтобы начать излучать события. Этот вызов защищен с помощью jwt_token. Таким образом, для запуска потока сервера необходим токен.

У меня такой вопрос, когда сервер уже выполняет потоковую передачу.

Допустим, я не подключен (поэтому действительный токен отсутствует). ), и я решил подключиться к потоку SSE, потому что я знаю имя канала и сервер уже работает в потоковом режиме. Если я начну новый EventSource на blabla:3000/sse?channel=myProject${projectID}. Смогу ли я увидеть все сообщения, отправленные через этот канал? Я полагаю, что да.

Как можно защитить эти события, передаваемые в потоковом режиме, только зарегистрированному пользователю?

Пример: (читать сверху вниз)

enter image description here

Как запретить пользователю, который знает channelName, получать все Поток событий сервером?

Поскольку внешний интерфейс и внутренний сервер в данный момент размещены в одном домене, но это может измениться, поэтому мне нужен широкий ответ.

1 Ответ

1 голос
/ 25 марта 2020

Это зависит от того, как вы настроили сервер SSE, и от того, ищете ли вы аутентифицированных пользователей. Вам необходимо настроить ваш эхо-сервер для обработки аутентификации, используя Go http.Handler

Как только вы это сделаете, не имеет значения, знаете ли вы имя канала и сервер, серверную часть все еще может отклонить отправку сообщений пользователям без токенов. Не думайте об этом как о токене как о том, что используется для создания канала, скорее думайте о нем как о запросе на подписку - вот что нужно - и затем в зависимости от того, аутентифицирован ли запрос или нет, служба затем либо разрешит, либо отказаться. Служба pu sh должна постоянно делать это для всех запросов на подписку.

Сервер - это то, что выдает токен при аутентификации, и как только вы получите свой ключ, вы можете сообщить серверу, что вы зарегистрирован, добавив токен в качестве параметра строки запроса с именем «ключ», или вы можете предоставить заголовок в вашем запросе. Вот как:

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

Вы также можете получить токен авторизации и передать его в свою строку запроса "accessToken" - аналогично тому, как вы делаете это с ключом в приведенном выше примере. Но учтите, что вы можете буквально скопировать и передать этот ключ кому-нибудь там, и тогда они смогут прослушивать один и тот же канал. Вы также можете сохранить токен аутентификации в localalstorage и передать его в качестве заголовка. Вы можете использовать эту библиотеку для достижения этой цели:

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

Или вы можете использовать basi c auth, который может генерировать Cook ie, и отправить запрос на подписку вместе с Cook * ie, установив withCredentials = true:

var source = new EventSource(`blabla:3000/sse?channel=myProject${projectID}`, { withCredentials: true });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...