簡體   English   中英

如何使用 websocket 安全地將我的 cli 應用程序連接到網站

[英]How to connect my cli app to a website using websocket securely

我想要達到的目標

我有一個使用 react 構建的網站和一個使用 python 構建的命令行應用程序,用戶將在他們的機器上下載它們。

我想做的是,當用戶通過終端運行 python 代碼時,代碼應該在他們的瀏覽器上打開網站並與網站建立 websocket 連接。

現在用戶可以在網站的輸入中輸入消息,這些消息將實時發送回命令行應用程序,該應用程序會將消息寫入用戶系統上的文件中。

如何確保用戶打開的網站唯一連接到終端,如果瀏覽器意外關閉,如何重新建立連接?

我的方法

我的方法是在終端中運行 python 腳本時,它會請求來自外部服務器的套接字連接,這將返回一個房間代碼作為響應。

然后 python 腳本將打開帶有房間代碼作為查詢字符串的網站,該網站將使用該網站請求將外部服務器添加到與終端的套接字房間,然后應用程序可以 go 來回發送消息

這種方法是否推薦且足夠安全?

是的,只要通過 wss 發送流量並且房間代碼不可猜測,您的解決方案聽起來就可以正常工作。

發送 websocket 消息的一種非常常見的模式是存儲連接的客戶端 ID 列表。 當一條新消息進入循環時,所有應該接收該消息並將其發送給它們的客戶端 ID。

因此,要處理重新連接,只需將新的客戶端 ID 添加到該房間的數據庫中。


我知道您提到了 python 但這里有一些 Typescript 代碼使用 AWS API 網關執行此操作。 希望它可以幫助你一點:

    /**
     * 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);
    },

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM