簡體   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