使用 ws WebSocket 进行身份验证

Authenticating using ws WebSocket

我正在使用 ws webSocket(不能使用 socket.io),我对它有点陌生。我知道它是如何工作的,但没有完全了解一些事情。

  1. 如何使用 jwt 进行身份验证? docs 说使用 upgrade 事件是正确的方法,但是当客户端连接时,upgrade 函数中的代码没有 运行。

  2. 添加事件类型的正确方法是什么?在 socket.io 中,可以使用 client.on('eventType', function) 收听。什么是 webSocket ws 等价物?

  3. 什么时候以及为什么要在 webSocket ws 中使用路径?

更新

我这边没有触发更新事件。这是我的代码:

文件 1

const server = require('http').createServer(app);
require('./socket/socket')(server);

文件 2

module.exports = function(server) {
    const WebSocket = require('ws');

    const wss = new WebSocket.Server({ port: 8080 });

    server.on('upgrade', function(request, socket, head) {
        console.log('Upgraded');

        wss.handleUpgrade(request, socket, head, function(ws) {
            wss.emit('connection', ws, request);
        });
    });

    wss.on('connection', function connection(ws) {
        ws.on('message', function incoming(message) {
            console.log('received: %s', message);
        });
    });
};
  1. ws 提供身份验证 examples。 这些在 HTTP 服务器首次处理身份验证请求时起作用。然后通过一个 对 ws 的 HTTP 升级请求,而不是 ws 本身监听一个端口。笔记 他们在设置中包含的 noServer: true 选项:

    const wss = new WebSocket.Server({ clientTracking: false, noServer: true });
    

    在 HTTP 中使用 koa or express jwt 组件会更容易 首先然后以这种方式进行升级。否则你需要 编写一个 ws message 处理程序来查找一些令牌数据并验证它。

  2. message是ws中的事件。您可以在 message 事件之上编写任何更具体的内容,这是使用 socket.io 的一个重要原因,它已经为您完成了所有这些工作(包括非常有用的客户端回调函数)。

  3. ws:// 或 http 升级请求中使用 URI 路径通常会连接到服务器端的单独 ws 上下文。一种将命名空间或连接分成离散组的简单方法。

How can I authenticate using jwt? The docs say that using the upgrade event is the correct way to go about it, but when the client connected, the code in the upgrade function didn't run.

嗯,有很多不同的选择。首次建立连接时,您可以将令牌作为自定义 header 的查询参数传递。您可能要求通过 webSocket 发送的第一个数据是一个令牌,如果这样的令牌没有很快到达并断开连接。如果客户端已经通过身份验证并且有一个 http cookie 表明这一点,您可以在 websocket 连接时检查该 cookie。

What's the correct way to add an event type? In socket.io, one can listen using client.on('eventType', function). What's the webSocket ws equivalent?

socket.io 消息类型(或您所说的事件类型)是 socket.io 添加到 webSocket 之上的东西。 webSocket 协议本身没有这样的东西。您发送一个数据包,该数据包到达另一端。所有数据包都是同一个webSocket"type"。如果你想将你的数据包识别为某种类型的消息,那么你必须在你的数据中发明一种方法来做到这一点。例如,如果您的数据是 JSON 格式的,您可以在事件消息中添加 type: "someType" 属性,然后在收到后检查 属性(这实际上是 socket.io 确实如此,尽管它是在 socket.io 有效负载之外执行的。

When and why would one use paths in webSocket ws?

您可能有两个完全独立的代码部分,它们将 webSocket 用于不同的事物,这些事物没有任何共同点并且驻留在不同的模块中,并且每个部分都有自己的 webSocket 连接更直接。而且,它们可能被两种完全不同类型的客户端使用。

当 webSocket 客户端连接到您的服务器时如何访问原始 URL here 在您服务器的 upgrade 事件中与 ws 库一起使用。

您会注意到该示例中 upgrade 事件发生在 http 服务器上,而不是 websocket 服务器实例上。