如何使用 websocket 安全地将我的 cli 应用程序连接到网站

Posted

技术标签:

【中文标题】如何使用 websocket 安全地将我的 cli 应用程序连接到网站【英文标题】:How to connect my cli app to a website using websocket securely 【发布时间】:2020-12-04 04:56:57 【问题描述】:

我想要达到的目标

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

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

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

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

我的方法

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

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

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

【问题讨论】:

【参考方案1】:

是的,只要流量通过 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);
    ,

【讨论】:

以上是关于如何使用 websocket 安全地将我的 cli 应用程序连接到网站的主要内容,如果未能解决你的问题,请参考以下文章

如何成功地将我的默认合并工具实用程序更改为 opendiff

我将如何迭代地将我的数组输入转换为整数

Xcode:如何轻松地将我的 Int 值从 UIview 传递到下一个 UIViewcontroller?

ember-cli 0.0.47 升级后违反内容安全策略指令

如何将我的全局 vue-cli 安装升级到最新版本?

如何将我的 ionic cli 降级到以前的版本?