[英]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.