WebSocket 鉴权策略与技巧详解

news2024/11/16 13:43:10

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.coloradmin.cn/o/1249100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础课10——自然语言生成

自然语言生成是让计算机自动或半自动地生成自然语言的文本。这个领域涉及到自然语言处理、语言学、计算机科学等多个领域的知识。 1.简介 自然语言生成系统可以分为基于规则的方法和基于统计的方法两大类。基于规则的方法主要依靠专家知识库和语言学规则来生成文本&#xff0…

卷积神经网络(CNN)识别验证码

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据4.标签数字化 二、构建一个tf.data.Dataset1.预处理函数2.加载数据3.配置数据 三、搭建网络模型四、编译五、训练六、模型评估七、保存和加载模型八、预测 …

定时器详解

定时器是一种控制任务延时执行,或者周期执行的技术。 作用:闹钟、定时邮件发送。 定时器的两种实现方式:Timer 、ScheduledExecutorService。 Timer定时器 API public Timer() 创建Timer定时器对象,并启动线程。 public voi…

【五年创作纪念日】

机缘 我成为创作者的过程并不复杂,可以说是一个自然的发展。我是一名软件工程师,日常的工作主要是编程和解决问题。在工作的过程中,我发现有很多时候我需要查找一些特定的技术问题或者寻找一些最佳实践来解决我遇到的问题。在这个过程中&…

TransFusionNet:JetsonTX2下肝肿瘤和血管分割的语义和空间特征融合框架

TransFusionNet: Semantic and Spatial Features Fusion Framework for Liver Tumor and Vessel Segmentation Under JetsonTX2 TransFusionNet:JetsonTX2下肝肿瘤和血管分割的语义和空间特征融合框架背景贡献实验方法Transformer-Based Semantic Feature Extractio…

CentOS7安装Docker运行环境

1 引言 Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,…

短视频ai剪辑矩阵分发saas系统源头技术开发

抖音账号矩阵系统是基于抖音开放平台研发的用于管理和运营多个抖音账号的平台。它可以帮助用户管理账号、发布内容、营销推广、分析数据等多项任务,从而提高账号的曝光度和影响力。 具体来说,抖音账号矩阵系统可以实现以下功能: 1.多账号多…

虚拟KOL搅动“网红圈”,出海品牌该如何与其合作?

近年来,虚拟KOL已经成为了数字营销领域的一股强大力量。虚拟网红的崛起在社交媒体平台上引起了广泛的关注,其独特的吸引力和影响力使其成为了各类品牌愿意与之合作的理想伙伴。特别是对于那些试图进军国际市场的出海品牌来说,与虚拟网红合作不…

系列六、Spring整合单元测试

一、概述 Spring中获取bean最常见的方式是通过ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式获取bean,那么在Spring中如何像在SpringBoot中直接一个类上添加个SpringBootTest注解,即可在类中注入自己想要测试…

JMeter 测试脚本编写技巧

JMeter 是一款开源软件,用于进行负载测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本,模拟多种不同的负载情况,从而评估系统的性能和稳定性。以下是编写 JMeter 测试脚本的步骤。 第 1 步:创建测试计划 在JMet…

【Unity】EventSystem.current.IsPointerOverGameObject()对碰撞体起作用

本来我是用 EventSystem.current.IsPointerOverGameObject()来检测是否点击在UI上的,但是发现,他对我的碰撞体也是返回ture,研究半天。。。。找不出问题,然后发现我的相机上挂载了PhysicsRaycaster,去掉之后就好了,至于…

2014年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2014 年考研管理类联考数学真题一、问题求解(本大题共 15 小题,每小题 3 分,共 45 分)下列每题给出 5 个选项中,只有一个是符合要求的,请在答题卡上将所选择的字母涂黑。真题(2014-01&…

蓝桥杯物联网竞赛_STM32L071_3_Oled显示

地位: 对于任何一门编程语言的学习,print函数毫无疑问是一种最好的调试手段,调试者不仅能通过它获取程序变量的运行状态而且通过对其合理使用获取程序的运行流程,更能通过关键变量的输出帮你验证推理的正确与否,朴素的…

12V降3.3V100mA稳压芯片WT7133

12V降3.3V100mA稳压芯片WT7133 WT71XX系列是一款采用CMOS工艺实现的三端高输入电压、低压差、小输出电流电压稳压器。 它的输出电流可达到100mA,输入电压可达到18V。其固定输出电压的范围是2.5V~8.0V,用户 也可通过外围应用电路来实现可变电压…

使用dbutil工具类查询数据表时,servlet传入sql数据 返回结果为null

使用dbutil工具类查询数据表时,servlet传入sql数据 返回结果为null 原本数据表中该有的数据却返回为空 解决办法: 在jdbc.properties配置文件中url连接里面加上utf-8字符集 urljdbc:mysql://localhost:3306/qfedu?useUnicodetrue&characterEncodi…

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

文章目录 Pre概述Jar 打包方式_maven-jar-pluginOverview使用官方文档 Shade 打包方式_maven-shade-pluginOverview使用将部分jar包添加或排除将依赖jar包内部资源添加或排除自动将所有不使用的类排除将依赖的类重命名并打包进来 (隔离方案)修改包的后缀…

【合集一】每日一练30讲,轻松掌握Verilog语法

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com) 第一练:如何区分<=表示的含义? 题目:请描述以下两种方法产…

什么年代了,你还不会自动化测试?

一、前言 在软件测试中,自动化测试指的是使用独立于待测软件的其他软件来自动执行测试、比较实际结果与预期并生成测试报告这一过程。在测试流程已经确定后,测试自动化可以自动执行的一些重复但必要测试工作。也可以完成手动测试几乎不可能完成的测试。…

葡萄酒怎么按照饮用时间分类?

不同的葡萄酒搭配不同的餐食,会让饮酒人有不一样的感受和体会,所以,葡萄酒是分场合并且有饮用时间的。云仓酒庄的品牌雷盛红酒分享一般按照饮用时间分类可以把葡萄酒分为三大类,分别是餐前酒、佐餐酒和餐后酒。 餐前酒&#xff1…