Как безопасно подключить мое cli-приложение к веб-сайту с помощью websocket

#python #reactjs #websocket #command-line-interface

#python #reactjs #websocket #интерфейс командной строки

Вопрос:

Чего я хочу достичь

У меня есть веб-сайт, созданный с использованием react, и приложение командной строки, созданное с использованием python, которое пользователь загрузит на свой компьютер.

Что я хочу сделать, так это то, что когда пользователь запускает код python через терминал, код должен открыть веб-сайт в своем браузере и установить соединение websocket с веб-сайтом.

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

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

Мой подход

Мой подход заключается в том, что при запуске скрипта python в терминале он запрашивает соединение с сокетом с внешнего сервера, который в ответ возвращает код номера.

Затем скрипт python откроет веб-сайт с кодом комнаты в качестве строки запроса, которую веб-сайт будет использовать для запроса добавления внешнего сервера в комнату сокета с терминалом, а затем приложения могут переходить туда и обратно с сообщениями

Является ли этот подход рекомендуемым и достаточно безопасным?

Ответ №1:

Да, ваше решение звучит так, как будто оно будет работать нормально, пока трафик передается через wss, а код номера невозможно угадать.

Довольно распространенным шаблоном отправки сообщений websocket является сохранение списка подключенных идентификаторов клиентов. Когда приходит новое сообщение, перебирайте все идентификаторы клиентов, которые должны получить сообщение, и отправляйте его каждому из них.

Поэтому для обработки повторного подключения просто добавьте новый идентификатор клиента в базу данных для этой комнаты.


Я знаю, что вы упомянули python, но вот некоторый код Typescript с использованием AWS API Gateway, который это делает. Надеюсь, это может вам немного помочь:

     /**
     * Sends a websocket message to all connected clients
     */
    sendMessage: async (message: string, room: string) => {
        const connections = await database.getAllClientsInRoom(room);

        const apigwManagementApi = new AWS.ApiGatewayManagementApi({
            apiVersion: '2018-11-29',
            endpoint: process.env.WS_ENDPOINT,
        });

        const requests = connections.map(async ({ connectionID }) => {
            await apigwManagementApi.postToConnection({ ConnectionId: connectionID, Data: message }).promise();
            console.log(`Message sent to: ${connectionID}`);
        });

        return await Promise.all(requests);
    },