使用ws WebSocket进行身份验证

时间:2020-01-19 05:34:50

标签: node.js websocket ws

我正在使用ws webSocket(不能使用socket.io),但是我对此有些陌生。我知道它是如何工作的,但还没有完全掌握。

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

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

  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);
        });
    });
};

2 个答案:

答案 0 :(得分:0)

  1. ws提供身份验证examples。 这些在HTTP服务器首先处理auth请求时起作用。然后通过 对ws的HTTP升级请求,而不是ws本身在端口上侦听。注意 它们包含在设置中的noServer: true选项:

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

    在HTTP中使用koaexpress将使jwt组件更容易 首先,以这种方式进行升级。否则,您将需要 编写ws message处理程序以查找一些令牌数据并进行验证。

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

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

答案 1 :(得分:0)

如何使用jwt进行身份验证?文档说使用升级事件是解决此问题的正确方法,但是当客户端连接时,升级功能中的代码未运行。

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

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

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

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

您可能有两个完全独立的代码部分,它们将webSocket用于不同的事物,这些事物没有共同之处,并且位于单独的模块中,而每个人拥有自己的webSocket连接则更加直接。并且,它们可以由两种完全独立的客户端使用。

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

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