nodejs 和其他语言(比如 Python)连接 wss 的差异

0 条回复
18 次浏览

同一个 wss,使用 Python 连接直接拒绝,提示 401/403 之类的,需要认证,但是网页上抓包可以看到是先连接再把 token 发送过去,同样的情况使用 nodejs 就可以,问了一下 ai,说是这是一个非常典型的 WebSocket / WSS 行为差异问题,不是 Node.js 和 Python “谁更宽松”,而是库默认行为不同 + 服务端校验时机不同导致的。
意思是 nodejs 和前端 js 连接 wss 的时候发送 token,实际上是在握手阶段完成的,Python 是先握手完成再发消息。
我的代码如下

复制
# Windows 上兼容老版本 websockets
if sys.platform == "win32":
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
import websockets


async def ws():
    url = "wss://xxxxx/api/servers/xxxxx/ws"



    async with websockets.connect(url) as websocket:
        print("连接成功!发送 token...")

        # 如果服务器要求连接后立即发送 token,可以直接发送
        await websocket.send("<你的 Token 或 json 格式消息>")

        # 接收服务器消息
        async for message in websocket:
            print("收到消息:", message)


if __name__ == '__main__':
    asyncio.run(ws())

image
实际上都没连上,没机会发 token

复制
let token = await getToken();
    if (!token) return;

    const url = `wss://xxxx/api/servers/${server_uuid}/ws`;

    ws = new WebSocket(url, {
        headers: {
            Origin: 'https://xxxx'
        }
    });

    ws.on('open', () => {
        console.log('WS 连接成功');
        // 连接后立即发送 token
        sendToken(token);
    });

只摘了一部分
image
可以看到这个就没问题,连接、发送 token、正常通信。

好像 postman 也不能这么操作,目前用 nodejs 解决了这个问题,不知道大家遇到没有。

👍2

发表一个评论

R保持