前期准备
GET /api2/json/access/ticket
POST /api2/json/nodes/{node}/qemu/{vmid}/vncproxy
wss /api2/json/nodes/{node}/qemu/{vmid}/vncwebsocket
vncproxy 和 ticket 需要一起创建,noVNC连接vncwebsocket 需要 PVEAuthCookie才能正常通信否则无法连接。
注意:请求/api2/json/access/ticket必须要用户密码获取,用root token无法创建。
PVE 的设计思路是将 VM 分配给用户,但是没给token设计获取 ticket 应该是考虑权限分离。
github The-Network-Crew的解决路子是直接用 root创建PVEAuthCookie, 虽然没有CSRFPreventionToken但不知道是否会有泄露权限的风险
https://github.com/The-Network-Crew/Proxmox-VE-for-WHMCS/blob/master/modules/servers/pvewhmcs/pvewhmcs.php
ConvoyPanel的解决思路是直接搞了个coterm来封装
location / websocket / {
#add_header Strict - Transport - Security "max-age=31536000; includeSubDomains"always;
proxy_read_timeout 360;
proxy_connect_timeout 60;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_cache_bypass $http_upgrade;
proxy_set_header Cookie "PVEAuthCookie=$arg_pveticket";
proxy_ssl_verify off;
proxy_set_header Host $arg_host: $arg_port1;
proxy_pass https: //$arg_host:$arg_port1/api2/json/nodes/$arg_node/$arg_type/$arg_vmid/vncwebsocket?port=$arg_vncport&vncticket=$arg_vncticket;
}
url传入数据websocket/?host=XXXX&port1=8006&node=xxx&type=qemu&vmid=xxxx&vncport=xxxx&vncticket= xxxx&pveticket
另外一种方式可以直接用 cookie 方式传入,在程序内直接对客户端写入 cookie
把nginx 从GET的$arg_ 参数换成 $cookie_获取。