4.1 KiB
4.1 KiB
RDP 连接重构计划
目标: 将 RDP 令牌生成流程移至后端,提高安全性,遵循高内聚低耦合原则。
核心流程: 前端请求主后端 -> 主后端获取连接信息和解密密码 -> 主后端调用 RDP 后端获取令牌 -> RDP 后端生成并返回令牌 -> 主后端将令牌返回给前端 -> 前端使用令牌连接 RDP 后端的 WebSocket。
具体步骤:
-
主后端 (
packages/backend)- 创建新 API 端点:
- 在
packages/backend/src/connections/connections.routes.ts中添加一个新的路由,例如POST /api/connections/:id/rdp-session。 - 在
packages/backend/src/connections/connections.controller.ts中添加对应的处理函数。
- 在
- 实现 Controller 逻辑:
- 接收路径参数
id。 - 调用
connection.service.ts的getConnectionWithDecryptedCredentials(id)。 - 验证连接是否存在且类型为 'RDP'。
- 从环境变量或配置中读取 RDP 后端的 API 地址 (例如
RDP_API_URL=http://localhost:9090)。 - 构造向 RDP 后端
/api/get-token发送请求所需的参数 (hostname, port, username, decryptedPassword, security, ignore-cert)。 - 使用 HTTP 客户端 (如
axios,如果未安装则需添加依赖) 向RDP_API_URL/api/get-token发送 GET 请求。 - 处理 RDP 后端的响应,提取
token。 - 将获取到的
token返回给前端。 - 添加错误处理逻辑(连接不存在、类型错误、调用 RDP 后端失败等)。
- 接收路径参数
- 配置: 确保可以通过环境变量或其他方式配置
RDP_API_URL。
- 创建新 API 端点:
-
RDP 后端 (
packages/rdp)- 修改 CORS:
- 在
packages/rdp/backend/src/server.ts中调整cors中间件的配置。需要允许来自主后端 API 的请求源。例如,如果主后端运行在http://localhost:3000,则配置为cors({ origin: ['http://localhost:5173', 'http://localhost:3000'] })或更灵活的配置。
- 在
- (可选) 增强安全性: 考虑在主后端调用
/api/get-token时增加一个简单的认证机制(例如,一个共享的 API 密钥放在请求头中),并在 RDP 后端进行验证,防止未授权访问。
- 修改 CORS:
-
前端 (
packages/frontend)- 修改 RDP 连接触发逻辑:
- 找到当前获取 RDP 令牌并发起连接的代码(可能在
src/components/RemoteDesktopViewer.vue或相关composables中)。 - 修改代码,使其调用主后端新增的
POST /api/connections/:id/rdp-session端点来获取 Guacamole 令牌。 - 使用从主后端获取到的
token来初始化Guacamole.Client或类似实例。
- 找到当前获取 RDP 令牌并发起连接的代码(可能在
- 确认 WebSocket 地址: 确保
Guacamole.Tunnel或 WebSocket 连接的目标地址仍然是 RDP 后端的 WebSocket 地址 (例如ws://localhost:8081或配置的值)。
- 修改 RDP 连接触发逻辑:
架构图 (Mermaid):
sequenceDiagram
participant F as 前端 (packages/frontend)
participant BE as 主后端 (packages/backend)
participant RDP as RDP 后端 (packages/rdp)
participant GuacD as guacd
F->>+BE: POST /api/connections/{id}/rdp-session
BE->>+BE: getConnectionWithDecryptedCredentials(id)
Note right of BE: 获取连接信息 (host, port, user) 和解密后的密码
BE-->>-BE: 返回连接信息和密码
alt 连接类型为 RDP
BE->>+RDP: GET /api/get-token?hostname=...&port=...&username=...&password=...
Note right of BE: 从配置读取 RDP_API_URL
RDP->>+RDP: 构建 Guacamole 连接参数
RDP->>+RDP: encryptToken(connectionParams)
RDP-->>-RDP: 返回加密后的令牌 (token)
RDP-->>-BE: 返回 { token: "..." }
BE-->>-F: 返回 { token: "..." }
else 连接类型非 RDP
BE-->>-F: 返回错误信息
end
Note over F: 前端获取到 token
F->>+RDP: WebSocket 连接 (ws://<RDP_WS_HOST>:<RDP_WS_PORT>)
Note right of F: 使用获取到的 token 进行认证
RDP->>+GuacD: 建立 Guacamole 连接
GuacD-->>-RDP: Guacamole 协议通信
RDP-->>-F: Guacamole 协议通信 (通过 WebSocket)