首页 > 解决方案 > 如何使用 websocket 安全地将我的 cli 应用程序连接到网站

问题描述

我想要达到的目标

我有一个使用 react 构建的网站和一个使用 python 构建的命令行应用程序,用户将在他们的机器上下载它们。

我想做的是,当用户通过终端运行 python 代码时,代码应该在他们的浏览器上打开网站并与网站建立 websocket 连接。

现在用户可以在网站的输入中输入消息,这些消息将实时发送回命令行应用程序,该应用程序会将消息写入用户系统上的文件中。

如何确保用户打开的网站唯一连接到终端,如果浏览器意外关闭,如何重新建立连接?

我的方法

我的方法是在终端中运行 python 脚本时,它会从外部服务器请求一个套接字连接,这将返回一个房间代码作为响应。

然后python脚本将打开网站,房间代码作为查询字符串,网站将使用该字符串请求将外部服务器添加到与终端的套接字房间,然后应用程序可以来回发送消息

这种方法是否推荐且足够安全?

标签: pythonreactjswebsocketcommand-line-interface

解决方案


是的,只要通过 wss 发送流量并且房间代码不可猜测,您的解决方案听起来就可以正常工作。

发送 websocket 消息的一种非常常见的模式是存储连接的客户端 ID 列表。当一条新消息进入循环时,所有应该接收该消息并将其发送给它们的客户端 ID。

因此,要处理重新连接,只需将新的客户端 ID 添加到该房间的数据库中。


我知道你提到了 python,但这里有一些使用 AWS API Gateway 的 Typescript 代码。希望它可以帮助你一点:

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

推荐阅读