python - 如何使用 websocket 安全地将我的 cli 应用程序连接到网站
问题描述
我想要达到的目标
我有一个使用 react 构建的网站和一个使用 python 构建的命令行应用程序,用户将在他们的机器上下载它们。
我想做的是,当用户通过终端运行 python 代码时,代码应该在他们的浏览器上打开网站并与网站建立 websocket 连接。
现在用户可以在网站的输入中输入消息,这些消息将实时发送回命令行应用程序,该应用程序会将消息写入用户系统上的文件中。
如何确保用户打开的网站唯一连接到终端,如果浏览器意外关闭,如何重新建立连接?
我的方法
我的方法是在终端中运行 python 脚本时,它会从外部服务器请求一个套接字连接,这将返回一个房间代码作为响应。
然后python脚本将打开网站,房间代码作为查询字符串,网站将使用该字符串请求将外部服务器添加到与终端的套接字房间,然后应用程序可以来回发送消息
这种方法是否推荐且足够安全?
解决方案
是的,只要通过 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);
},
推荐阅读
- c# - 事件日志 API 缺少条目
- google-cloud-platform - GCP Dataflow Apache Beam 写入输出错误处理
- javascript - 确定要删除吗?
- twitter-bootstrap - 我如何使用 v-bind:class 来改变颜色的条件
- angular - 无法读取未定义的属性“下一个”。角。重命名错误
- webview - 在 Android 和 iOS 上的 WebView 中使用 Analytics
- angular - 我应该如何测试 Angular 6 中出现的错误消息
- amazon-web-services - 在 Redshift 中检查用户的“连接限制”
- angular - 在 RXJS 6 中使用 Reducer 内的服务
- zend-framework - 如何在 SocialEngine Zend 中创建自定义 API 路由