WebSocket 鑒權策略與技巧詳解

WebSocket 作為實時通信的利器,越來越受到開發者的青睞。然而,為了確保通信的安全性和合法性,鑒權成為不可或缺的一環。本文將深入探討 WebSocket 的鑒權機制,為你呈現一攬子的解決方案,確保你的 WebSocket 通信得心應手。

alt

使用場景

WebSocket 鑒權在許多場景中都顯得尤為重要。例如,實時聊天應用、在線協作工具、實時數據更新等情境都需要對 WebSocket 進行鑒權,以確保只有合法的用戶或服務可以進行通信。通過本文的指導,你將更好地了解在何種場景下使用 WebSocket 鑒權是有意義的。

WebSocket 調試工具

要調試 WebSocket,那就需要一個好的調試工具,這里我比較推薦 Apifox。它支持調試 http(s)、WebSocket、Socket、gRPCDubbo 等多種協議的接口,這使得它成為了一個非常全面的接口測試工具!

alt

常見方法

方法 1:基于 Token 的鑒權

WebSocket 鑒權中,基于 Token 的方式是最為常見和靈活的一種。通過在連接時攜帶 Token,服務器可以驗證用戶的身份。以下是一個簡單的示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 3000 });

server.on('connection', (socket, req) => {

????const token = req.headers['sec-websocket-protocol'];

?????

????// 驗證token的合法性

????if (isValidToken(token)) {

????????// 鑒權通過,進行后續操作

????????socket.send('鑒權通過,歡迎連接!');

????} else {

????????// 鑒權失敗,關閉連接

????????socket.close();

????}

});

方法 2:基于簽名的鑒權

另一種常見的鑒權方式是基于簽名的方法。通過在連接時發送帶有簽名的信息,服務器驗證簽名的合法性。以下是一個簡單的示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

const WebSocket = require('ws');

const crypto = require('crypto');

const server = new WebSocket.Server({ port: 3000 });

server.on('connection', (socket, req) => {

????const signature = req.headers['x-signature'];

????const data = req.url + req.headers['sec-websocket-key'];

?????

????// 驗證簽名的合法性

????if (isValidSignature(signature, data)) {

????????// 鑒權通過,進行后續操作

????????socket.send('鑒權通過,歡迎連接!');

????} else {

????????// 鑒權失敗,關閉連接

????????socket.close();

????}

});

方法 3:基于 IP 白名單的鑒權

在某些情況下,你可能希望限制 WebSocket 連接只能來自特定 IP 地址范圍。這時可以使用基于 IP 白名單的鑒權方式。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

const WebSocket = require('ws');

const allowedIPs = ['192.168.0.1', '10.0.0.2'];

const server = new WebSocket.Server({ port: 3000 });

server.on('connection', (socket, req) => {

????const clientIP = req.connection.remoteAddress;

?????

????// 驗證連接是否在白名單中

????if (allowedIPs.includes(clientIP)) {

????????// 鑒權通過,進行后續操作

????????socket.send('鑒權通過,歡迎連接!');

????} else {

????????// 鑒權失敗,關閉連接

????????socket.close();

????}

});

方法 4:基于 OAuth 認證的鑒權

在需要與現有身份驗證系統集成時,OAuth 認證是一種常見的選擇。通過在連接時使用 OAuth 令牌,服務器可以驗證用戶的身份。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

const WebSocket = require('ws');

const axios = require('axios');

const server = new WebSocket.Server({ port: 3000 });

server.on('connection', async (socket, req) => {

????const accessToken = req.headers['authorization'];

?????

????// 驗證OAuth令牌的合法性

????try {

????????const response = await axios.get('https://oauth-provider.com/verify', {

????????????headers: { Authorization: `Bearer ${accessToken}` }

????????});

????????if (response.data.valid) {

????????????// 鑒權通過,進行后續操作

????????????socket.send('鑒權通過,歡迎連接!');

????????} else {

????????????// 鑒權失敗,關閉連接

????????????socket.close();

????????}

????} catch (error) {

????????// 驗證失敗,關閉連接

????????socket.close();

????}

});

其他常見方法...

除了以上介紹的方式,還有一些其他的鑒權方法,如基于 API 密鑰、HTTP 基本認證等。根據具體需求,選擇最適合項目的方式。

實踐案例

基于 Token 的鑒權實踐

  1. 在 WebSocket 連接時,客戶端攜帶 Token 信息。
  2. 服務器接收 Token 信息并驗證其合法性。
  3. 根據驗證結果,允許或拒絕連接。

1

2

// 客戶端代碼

const socket = new WebSocket('ws://localhost:3000', ['Bearer YOUR_TOKEN']);

1

2

3

4

5

6

7

8

9

10

// 服務器端代碼

server.on('connection', (socket, req) => {

????const token = req.headers['sec-websocket-protocol'];

?????

????if (isValidToken(token)) {

????????socket.send('鑒權通過,歡迎連接!');

????} else {

????????socket.close();

????}

});

基于簽名的鑒權實踐

  1. 在 WebSocket 連接時,客戶端計算簽名并攜帶至服務器。
  2. 服務器接收簽名信息,驗證其合法性。
  3. 根據驗證結果,允許或拒絕連接。

1

2

// 客戶端代碼

const socket = new WebSocket('ws://localhost:3000', { headers: { 'X-Signature': calculateSignature() } });

1

2

3

4

5

6

7

8

9

10

11

// 服務器端代碼

server.on('connection', (socket, req) => {

????const signature = req.headers['x-signature'];

????const data = req.url + req.headers['sec-websocket-key'];

?????

????if (isValidSignature(signature, data)) {

????????socket.send('鑒權通過,歡迎連接!');

????} else {

????????socket.close();

????}

});

基于 IP 白名單的鑒權實踐

  1. 在 WebSocket 連接時,服務器獲取客戶端 IP 地址。
  2. 驗證 IP 地址是否在白名單中。
  3. 根據驗證結果,允許或拒絕連接。

1

2

3

4

5

6

7

8

9

10

// 服務器端代碼

server.on('connection', (socket, req) => {

????const clientIP = req.connection.remoteAddress;

?????

????if (allowedIPs.includes(clientIP)) {

????????socket.send('鑒權通過,歡迎連接!');

????} else {

????????socket.close();

????}

});

基于 OAuth 認證的鑒權實踐

  1. 在 WebSocket 連接時,客戶端攜帶 OAuth 令牌。
  2. 服務器調用 OAuth 服務驗證令牌的合法性。
  3. 根據驗證結果,允許或拒絕連接。

1

2

// 客戶端代碼

const socket = new WebSocket('ws://localhost:3000', { headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN' } });

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// 服務器端代碼

server.on('connection', async (socket, req) => {

????const accessToken = req.headers['authorization'];

?????

????try {

????????const response = await axios.get('https://oauth-provider.com/verify', {

????????????headers: { Authorization: `Bearer ${accessToken}` }

????????});

????????if (response.data.valid) {

????????????socket.send('鑒權通過,歡迎連接!');

????????} else {

????????????socket.close();

????????}

????} catch (error) {

????????socket.close();

????}

});

提示、技巧和注意事項

  • 在選擇鑒權方式時,要根據項目的實際需求和安全性要求進行合理選擇。
  • 對于基于 Token 的鑒權,建議使用 JWT(JSON Web Token)來提高安全性。
  • 在驗證失敗時,及時關閉連接,以防止未授權的訪問。

在 Apifox 中調試 WebSocket

如果你要調試 WebSocket 接口,并確保你的應用程序能夠正常工作。這時,一個強大的接口測試工具就會派上用場。

Apifox 是一個比 Postman 更強大的接口測試工具,Apifox = Postman + Swagger + Mock + JMeter。它支持調試 http(s)、WebSocket、Socket、gRPC、Dubbo 等多種協議的接口,這使得它成為了一個非常全面的接口測試工具,所以強烈推薦去下載體驗!

首先在 Apifox 中新建一個 HTTP 項目,然后在項目中添加 WebSocket 接口。

alt

alt

接著輸入 WebSocket 的服務端 URL,例如:ws://localhost:3000,然后保存并填寫接口名稱,然后確定即可。

alt

alt

點擊“Message 選項”然后寫入“你好啊,我是 Apifox”,然后點擊發送,你會看到服務端和其它客戶端都接收到了信息,非常方便,快去試試吧!

alt

以下用 Node.js 寫的 WebSocket 服務端和客戶端均收到了消息。

alt

總結

通過本文的介紹,你應該對 WebSocket 鑒權有了更清晰的認識。不同的鑒權方式各有優劣,你可以根據具體情況選擇最適合自己項目的方式。在保障通信安全的同時,也能提供更好的用戶體驗。

參考鏈接

  • MDN Web Docs - WebSocket
  • JSON Web Tokens
  • OAuth 2.0

學習更多:

  • WebSocket 如何建立連接

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/168091.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/168091.shtml
英文地址,請注明出處:http://en.pswp.cn/news/168091.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Qt之QTextDocument】使用及表格顯示富文本解決方案

【Qt之QTextDocument】使用 描述常用方法及示例使用QTextList使用QTextBlock使用QTextTable表格顯示富文本結論 描述 QTextDocument類保存格式化的文本。 QTextDocument是結構化富文本文檔的容器,支持樣式文本和各種文檔元素,如列表、表格、框架和圖像。…

CANopen協議【SDO】

SDO: SDO是讀寫單個寄存器。主要用于配置伺服驅動器參數。 1 收發功能: //public unsafe struct VCI_CAN_OBJ //CAN數據幀 【單幀對象】//{// public uint ID;// 幀ID。 【11bit】數據右對齊。 詳情請參照: 《8.附件1&#xff1…

Python 模塊

目錄 模塊 6.1. 模塊詳解 6.1.1. 以腳本方式執行模塊 6.1.2. 模塊搜索路徑 6.1.3. “已編譯的” Python 文件 6.2. 標準模塊 6.3. dir() 函數 6.4. 包 6.4.1. 從包中導入 * 6.4.2. 相對導入 6.4.3. 多目錄中的包 模塊 退出 Python 解釋器后,再次進入時&a…

手把手教你安裝 Visual Studio 2022 及其簡單使用

軟件下載 打開 Visual Studio 官網,個人選擇免費的Community社區版就夠用了。 軟件安裝 雙擊運行安裝程序: 點擊繼續 即可: 等待加載完成: 可以看到 Visual Studio 2022 對應不同的開發需求提供了若干工作負載,這里以…

?3ds Max插件CG MAGIC圖形板塊為您提升線條效率!

?通過3ds Max軟件進行繪圖操作時,大多絆住各位設計師們作圖速度的往往都是一些細微的瑣事,重復一變一變的調整修改等問題。 今天說到這個繪圖線條來回調整解決方法就是3ds Max插件CG MAGIC。 Max插件CG MAGIC作為一款智能化的輔助插件,致力于…

flutter編譯和構建鴻蒙應用程序(windows環境)

flutter編譯和構建鴻蒙應用程序(windows環境) 問題背景 針對 OpenHarmony 的 Flutter 版本已經開源,參考 https://gitee.com/openharmony-sig/flutter_flutter。 本文為實踐該流程,實現flutter打包鴻蒙hap包的流程。目前流程已經…

flink的java.lang.IllegalStateException: Buffer pool is destroyed 異常

背景 最近flink的在線應用出現錯誤java.lang.IllegalStateException: Buffer pool is destroyed,本文記錄下這個錯誤的原因 錯誤原因 詳細的日志堆棧如下: Caused by: java.lang.IllegalStateException: Buffer pool is destroyed. at org.apache.flink.runtime…

Ps:畫筆工具的基本操作

畫筆工具 Brush Tool是 Ps 中最常用的工具,廣泛地用于繪畫與修飾工作。 雖然多數操作可在畫筆工具的工具選項欄中選擇執行,但是如果能記住相應的快捷鍵可大大提高工作效率。 熟練掌握畫筆工具的操作對于使用其他工具也非常有益,因為 Ps 中許多…

CSS-長度單位篇

px:像素em:相對元素font-size的倍數rem:相對根字體大小,html標簽就是根%:相對父元素計算 注意:CSS中設置長度,必須加單位,否則樣式無效!

Maven - 打包之爭:Jar vs. Shade vs. Assembly

文章目錄 Pre概述Jar 打包方式_maven-jar-pluginOverview使用官方文檔 Shade 打包方式_maven-shade-pluginOverview使用將部分jar包添加或排除將依賴jar包內部資源添加或排除自動將所有不使用的類排除將依賴的類重命名并打包進來 (隔離方案)修改包的后綴…

ElasticSearch之cat component templates API

命令樣例如下: curl -X GET "https://localhost:9200/_cat/component_templates?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下: name …

Qt/QML編程學習之心得:一個QML工程的學習筆記(十)

前言: 到底什么是Qt Quick呢?因為Qt Quick是Qt新引入的,Qt Quick由Qt Quick模塊提供,它是一個編寫QML應用的標準庫。Qt Quick模塊提供了兩種接口:使用QML語言創建應用的QML接口和使用C++語言擴展QML的C++接口。使用Qt Quick模塊,設計人員和開發人員可以輕松地構建流暢的…

【自主探索】基于 frontier_exploration 的單個機器人自主探索建圖

文章目錄 一、概述1、功能2、要求 二、使用方法1、用于運行演示2、用于開發人員2.1. 探索無/地圖數據2.2. 使用 /map 數據進行探索 三、提供的組件1、explore_client1.1. 調用的操作1.2. 訂閱主題1.3. 發布主題 2、explore_server2.1. 提供的操作2.2. 調用的操作2.3. 調用的服務…

【科技素養】藍橋杯STEMA 科技素養組模擬練習試卷6

1、將一個空塑料袋與一個裝滿空氣的塑料袋放到秤上稱重。在兩個塑料袋本身完全一樣的情況下,得出的結果會是 A、空塑料袋更重 B、裝滿空氣的塑料袋更重 C、兩個塑料袋一樣重 D、無法判斷 答案:C 2、全球變暖帶來的一個主要影響就是海平面的上升。造…

web前端開發基礎----標準流布局和非標準流布局

1,標準流布局 標準流,也稱文檔流或普通流,是所有元素默認的布局方式。 在標準流中,元素按照其在 HTML 中出現的順序,自上而下依次排列,并占據其父容器內的可用空間。 標準流中的元素按照其自然尺寸和位置進…

uniapp實現多時間段設置

功能說明&#xff1a; 1 點擊新增時間&#xff0c;出現一個默認時間段模板&#xff0c;不能提交 2 點擊“新增時間文本”&#xff0c;彈出彈窗&#xff0c;選擇時間&#xff0c;不允許開始時間和結束時間同時為00:00&#xff0c; <view class"item_cont"> …

TCP/IP協議:最流行的電子郵件協議SMTP(簡單郵件傳輸協議)詳解

SMTP 是一種電子郵件協議&#xff0c;用于通過互聯網從一個電子郵件帳戶向另一個電子郵件帳戶發送電子郵件。它是TCP/IP協議應用層的一部分。作為一種電子郵件協議&#xff0c;它建立了不同電子郵件客戶端和帳戶之間輕松信息交換的規則。這樣&#xff0c;簡單郵件傳輸協議就可以…

求最小的起始正整數

題目描述 給你一個整數數組 nums 。你可以選定任意的 正數 startValue 作為初始值。 你需要從左到右遍歷 nums 數組&#xff0c;并將 startValue 依次累加上 nums 數組中的值。 請你在確保累加和始終大于等于 1 的前提下&#xff0c;選出一個最小的 正數 作為 startValue 。…

【Rust 日報】2023-11-23 - egui 0.24 發布

項目 - egui 0.24 發布 egui 是一個易于使用的 Rust GUI 庫&#xff0c;支持在本地環境和瀏覽器中運行。 egui 0.24 的重要新特性是多視窗功能。在支持的后端上&#xff08;如eframe&#xff09;&#xff0c;用戶可以利用全新的 viewport API 同時生成多個本機窗口。 此外&…

Git 的基本概念和使用方式。

Git 是一個開源的分布式版本控制系統&#xff0c;它可以記錄代碼的修改歷史&#xff0c;跟蹤文件的版本變化&#xff0c;并支持多人協同開發。Git 的基本概念包括&#xff1a; 1. 倉庫&#xff08;Repository&#xff09;&#xff1a;存放代碼和版本歷史記錄的地方。 2. 分支…