繁体   English   中英

使用 ws WebSocket 进行身份验证

[英]Authenticating using ws WebSocket

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

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

  2. 添加事件类型的正确方法是什么? 在 socket.io 中,可以使用client.on('eventType', function)进行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 提供身份验证示例 这些在 HTTP 服务器第一次处理身份验证请求时起作用。 然后将 HTTP 升级请求传递给 ws 而不是 ws 本身监听端口。 请注意它们包含在设置中的noServer: true选项:

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

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

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

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

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

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

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

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

何时以及为什么会在 webSocket ws 中使用路径?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM