Files
nexus-terminal/RDP_REFACTOR_PLAN.md
T
Baobhan Sith 046fe72d4f update
2025-04-27 22:48:24 +08:00

4.1 KiB

RDP 连接重构计划

目标: 将 RDP 令牌生成流程移至后端,提高安全性,遵循高内聚低耦合原则。

核心流程: 前端请求主后端 -> 主后端获取连接信息和解密密码 -> 主后端调用 RDP 后端获取令牌 -> RDP 后端生成并返回令牌 -> 主后端将令牌返回给前端 -> 前端使用令牌连接 RDP 后端的 WebSocket。

具体步骤:

  1. 主后端 (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.tsgetConnectionWithDecryptedCredentials(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
  2. 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 后端进行验证,防止未授权访问。
  3. 前端 (packages/frontend)

    • 修改 RDP 连接触发逻辑:
      • 找到当前获取 RDP 令牌并发起连接的代码(可能在 src/components/RemoteDesktopViewer.vue 或相关 composables 中)。
      • 修改代码,使其调用主后端新增的 POST /api/connections/:id/rdp-session 端点来获取 Guacamole 令牌。
      • 使用从主后端获取到的 token 来初始化 Guacamole.Client 或类似实例。
    • 确认 WebSocket 地址: 确保 Guacamole.Tunnel 或 WebSocket 连接的目标地址仍然是 RDP 后端的 WebSocket 地址 (例如 ws://localhost:8081 或配置的值)。

架构图 (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)