WebSocket 鉴权实践:从入门到精通

WebSocket 作为实时通信的利器,越来越受到开发者的青睐。然而,为了确保通信的安全性和合法性,鉴权成为不可或缺的一环。本文将深入探讨 WebSocket 的鉴权机制,为你呈现一揽子的解决方案,确保你的 WebSocket 通信得心应手。

alt

使用场景

WebSocket 鉴权在许多场景中都显得尤为重要。例如,实时聊天应用、在线协作工具、实时数据更新等情境都需要对 WebSocket 进行鉴权,以确保只有合法的用户或服务可以进行通信。通过本文的指导,你将更好地了解在何种场景下使用 WebSocket 鉴权是有意义的。

WebSocket 调试工具

要调试 WebSocket,那就需要一个好的调试工具,这里我比较推荐 Apifox。它支持调试 http(s)、WebSocket、Socket、gRPCDubbo 等多种协议的接口,这使得它成为了一个非常全面的接口测试工具!

alt

常见方法

方法 1:基于 Token 的鉴权

WebSocket 鉴权中,基于 Token 的方式是最为常见和灵活的一种。通过在连接时携带 Token,服务器可以验证用户的身份。以下是一个简单的示例:

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:基于签名的鉴权

另一种常见的鉴权方式是基于签名的方法。通过在连接时发送带有签名的信息,服务器验证签名的合法性。以下是一个简单的示例:

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 白名单的鉴权方式。

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 令牌,服务器可以验证用户的身份。

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. 根据验证结果,允许或拒绝连接。
// 客户端代码
const socket = new WebSocket('ws://localhost:3000', ['Bearer YOUR_TOKEN']);
// 服务器端代码
server.on('connection', (socket, req) => {const token = req.headers['sec-websocket-protocol'];if (isValidToken(token)) {socket.send('鉴权通过,欢迎连接!');} else {socket.close();}
});

基于签名的鉴权实践

  1. 在 WebSocket 连接时,客户端计算签名并携带至服务器。
  2. 服务器接收签名信息,验证其合法性。
  3. 根据验证结果,允许或拒绝连接。
// 客户端代码
const socket = new WebSocket('ws://localhost:3000', { headers: { 'X-Signature': calculateSignature() } });
// 服务器端代码
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. 根据验证结果,允许或拒绝连接。
// 服务器端代码
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. 根据验证结果,允许或拒绝连接。
// 客户端代码
const socket = new WebSocket('ws://localhost:3000', { headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN' } });
// 服务器端代码
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 鉴权有了更清晰的认识。不同的鉴权方式各有优劣,你可以根据具体情况选择最适合自己项目的方式。在保障通信安全的同时,也能提供更好的用户体验。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/753886.shtml

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

相关文章

【C语言】【牛客】BC161 大吉大利,今晚吃鸡

文章目录 题目思路代码呈现 题目 链接: link 思路 这道题的本质其实不是考察C语言的运用,而是来考察我们对通项公式的总结。 我们可以看一下下面这道汉诺塔问题 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&…

【全网最详细】ComfyUI下,Insightface安装指南-聚梦小课堂

🥮背景 ComfyUI下使用IP-adapter下的faceID模型的时候,大家可能会遇到如下错误: Error occurred when executing InsightFaceLoader: No module named insightface File "F:\ComfyUI-aki\execution.py", line 151, in recursive_…

凝思操作系统离线安装mysql和node

PS:下面这就是国产凝思的界面,测试版本是V6.0.80,第一次听说这种系统,于是去官网下载部署包,下面是地址 注意:这个系统如果没有激活,ip都不会有,这样文件都不能传到服务器,xshell这些工具都连不…

自托管状态页面工具Kener

什么是 Kener ? Kener 是开源的 Node.js 状态页面工具,旨在轻松监控服务和处理事故。它提供了一个时尚且用户友好的界面,简化了对服务中断的跟踪,并改善了我们在事故期间的沟通方式。而最好的部分是,Kener 与 GitHub 无…

hosts文件丢失了怎么办?

hosts文件的位置:C:\Windows\System32\drivers\etc 丢失了恢复的方法: 在“管理员:命令提示符中输入: (winR 然后cmd) for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\d…

超实用!免费软件站大盘点,总有一款适合你

相信用Mac电脑的同学都知道一个网站MacWK,可以白嫖几乎所有常用软件,不用付费,但不好的消息是在2022年10月宣布关站,小编从此走上了开源免费的道路,尽管不太好用,奈何口袋木有钱,经过小编的不断…

AI大模型额外学习一:斯坦福AI西部世界小镇笔记(包括部署和源码分析)

文章目录 一、简单介绍1)项目代码介绍2)重新播放模拟3)适当修改分叉模拟 二、部署斯坦福小镇Demo1)准备工作2)解决遇到的bug3)启动服务器和前端 三、源码剖析1)主题顺序 github链接 一、简单介…

08|记忆:通过Memory记住客户上次买花时的对话细节

无论是LLM还是代理都是无状态的,每次模型的调用都是独立于其他交互的。也就是说,我们每次通过API开始和大语言模型展开一次新的对话,它都不知道你其实昨天或者前天曾经和它聊过天了。 使用ConversationChain from langchain import OpenAI…

1.gradle编译和运行

1.在Windows 项目的根目录下使用.\gradlew.bat build命令进行编译。 如果出错的原因是连接超时: Exception in thread “main” java.io.IOException: Downloading from https://services.gradle.org/distributions/gradle-8.6-bin.zip failed: timeout (10000ms) a…

黑马程序员——javase进阶——day09——线程安全,死锁,状态,通讯,线程池

目录: 线程安全 线程安全产生的原因线程的同步同步代码块同步方法Lock锁线程死锁 概述:产生条件:代码实践线程的状态线程通信线程池 线程使用存在的问题线程池的介绍线程池使用的大致流程线程池的好处Java提供好的线程池线程池处理Runnable任务线程池处理Callable任…

LeetCode刷题记录:(11)组合(初识回溯算法)

leetcode传送通道 暂时记录&#xff0c;这篇没啥营养&#xff0c;不用看了 class Solution {List<List<Integer>> result new ArrayList<>(); // 存所有组合List<Integer> path new LinkedList<>(); //存每一个组合public List<List<Int…

世界第一个AI软件工程师问世!

2024年3月13日&#xff0c;科技公司Cognition推出了世界上第一位人工智能软件工程师Devin AI。这项创新有望利用人工智能编码和机器学习的力量加快发展。Devin AI不仅仅是帮助&#xff1b;它是一个成熟的队友&#xff0c;发挥智能编码自动化和自主人工智能编码的魔力&#xff0…

salesforce生产环境如何删除触发器

由于生产环境不能直接删除触发器&#xff0c;所以需要在sandbox中先让触发器inactive再部署到生产环境&#xff0c;就可以让触发器失效了。

苍穹外卖-day08:导入地址簿功能代码(单表crud)、用户下单(业务逻辑)、订单支付(业务逻辑,cpolar软件)

苍穹外卖-day08 课程内容 导入地址簿功能代码用户下单订单支付 功能实现&#xff1a;用户下单、订单支付 用户下单效果图&#xff1a; 订单支付效果图&#xff1a; 1. 导入地址簿功能代码&#xff08;单表crud&#xff09; 1.1 需求分析和设计 1.1.1 产品原型&#xff08…

苍穹外卖-day04:项目实战-套餐管理(新增套餐,分页查询套餐,删除套餐,修改套餐,起售停售套餐)业务类似于菜品模块

苍穹外卖-day04 课程内容 新增套餐套餐分页查询删除套餐修改套餐起售停售套餐 要求&#xff1a; 根据产品原型进行需求分析&#xff0c;分析出业务规则设计接口梳理表之间的关系&#xff08;分类表、菜品表、套餐表、口味表、套餐菜品关系表&#xff09;根据接口设计进行代…

rocky9 编写一键安装mysql 的sh脚本

基本操作步骤 1、虚拟机最小化安装rocky9系统&#xff0c;安装后克隆一个系统&#xff1b;1个用来获取下载的rpm包&#xff0c;一个用来编写sh 测试脚本&#xff1b; 2、修改虚拟机的 yum配置文件&#xff0c;获取获取rpm程序 &#xff1a;启用缓存&#xff0c;并修改yum下载…

【数据结构与算法】:非递归实现快速排序、归并排序

&#x1f525;个人主页&#xff1a; Quitecoder &#x1f525;专栏&#xff1a;数据结构与算法 上篇文章我们详细讲解了递归版本的快速排序&#xff0c;本篇我们来探究非递归实现快速排序和归并排序 目录 1.非递归实现快速排序1.1 提取单趟排序1.2 用栈实现的具体思路1.3 代码…

Linux:git的基础操作

git的下载 版本控制系统一般分为两种&#xff0c;集中式版本控制系统&#xff0c;分布式版本控制系统 什么是集中式版本控制系统&#xff1a;版本库集中存放在中央服务器&#xff0c;工作时候使用自己的电脑&#xff0c;当工作时候在中央服务器上拉取最新版本的代码&#xff0c…

U盘变身“本地磁盘”?数据恢复与防范策略大揭秘

一、突发状况&#xff1a;U盘秒变“本地磁盘” 在日常工作生活中&#xff0c;U盘凭借其便携性和大容量&#xff0c;成为我们存储和传输数据的重要工具。然而&#xff0c;有时我们会遇到这样一个棘手的问题&#xff1a;原本应显示为可移动磁盘的U盘&#xff0c;在插入电脑后却突…

Nginx 的安装、启动和关闭

文章目录 一、背景说明二、Nginx 的安装2.1、依赖的安装2.2、Nginx 安装2.3、验证安装 三、启动 Nginx3.1、普通启动3.2、如何判断nginx已启动3.3、通过配置启动3.4、设置开机启动 四、关闭 Nginx4.1、优雅地关闭4.2、快速关闭4.3、只关闭主进程4.4、使用nginx关闭服务 五、重启…