Socket.io 中的身份验证

2024-02-11

我将尝试验证 socket.io 上的连接。

目前,用户首先通过 REST API 进行身份验证,然后,我向用户发送JsonWebToken与经过身份验证的用户的用户名。打开客户端和服务器之间的连接后,我的计划是暂时从已连接套接字列表中删除该套接字,以防止在执行身份验证时在服务器之间接收和发送数据。

在此身份验证中,我验证令牌,如果令牌有效,我将套接字的 ID 重新添加到已连接套接字的列表中。唯一的问题是第一部分不起作用。我似乎无法从列表中删除套接字。

为了测试这一点,我做了以下操作。

io.on('connection', function(socket){
    //temp delete socket
    delete io.sockets.connected[socket.id];
    console.log(io.sockets.connected);
    socket.emit("test");
});

如您所见,我删除了套接字并发出一个测试事件以查看套接字是否仍然打开。客户端在不应该收到的情况下收到了该消息。

有谁知道为什么会发生这种情况?


尝试使用套接字对象的断开连接方法,如下所示:

io.on('connection', function(socket){
    //temp delete socket
    socket.disconnect();

    console.log(io.sockets.connected);
    socket.emit("test");
});

UPDATE:

例如,如果您的 HTTP 服务器向客户端提供令牌:

app.post('/api/users', function (req, res) {
  var user = {
    username: req.body.username
  };

  var token = jwt.sign(user, secret, {expiresInMinutes: 30});

  res.json({token: token});
});

然后您可以重复使用该令牌来验证您的 websocket 连接。

从客户端(html 文件)发送令牌的代码将是:

socket = io.connect('http://localhost:4000', {
  query: 'token=' + validToken,
  forceNew: true
});

服务器(socketio)中的socketio授权代码将是:

// here is being used a socketio middleware to validate
// the token that has been sent
// and if the token is valid, then the io.on(connection, ..) statement below is executed
// thus the socket is connected to the websocket server.
io.use(require('socketio-jwt').authorize({
  secret: secret,
  handshake: true
}));



// but if the token is not valid, an error is triggered to the client
// the socket won't be connected to the websocket server.
io.on('connection', function (socket) {
  console.log('socket connected');
});

请注意,express 上使用的秘密用于生成令牌,socketio 中间件的验证令牌也使用相同的令牌。

我创建了一个示例,您可以在其中看到这种验证是如何工作的,源代码在这里:https://gist.github.com/wilsonbalderrama/a2fa66b4d2b6eca05a5d https://gist.github.com/wilsonbalderrama/a2fa66b4d2b6eca05a5d

将它们复制到文件夹中并使用 Node 运行 server.js,然后通过浏览器访问以下 URL 的 html 文件:http://本地主机:4000 http://localhost:4000

但首先安装模块:socket.io、express、socketio-jwt、jsonwebtoken

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Socket.io 中的身份验证 的相关文章

  • 何时不使用承诺[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在阅读了数十篇关于 es6 Promise 有多伟大以及为什么我们应该实现它们的文章之后 我有这样的感觉 ALL我的 不平凡的 JavaScri
  • 如何以非阻塞方式在 Node.js 中搜索数组?

    我有一个数组是 4ff023908ed2842c1265d9e4 4ff0d75c8ed2842c1266099b 我必须找出以下内容是否在该数组内 4ff0d75c8ed2842c1266099b 这是我写的 Array prototyp
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • FFMPEG:使用具有复杂滤波器的视频滤波器

    我正在使用fluent ffmpeg用于对视频文件执行批量操作的 Node js 库 视频过滤器裁剪 16 9 输入 添加填充并将字幕刻录到填充中 在下一步中 我想使用复杂的滤镜来覆盖图像作为水印 ff input video mp4 ff
  • Node Sequelize - “按原样”插入日期而不转换为 UTC

    我正在尝试运行一个简单的查询 例如 Insert into table somedate values 2018 06 11 23 59 00 但 Sequelize 将其执行为 Insert into table somedate val
  • 节点:以编程方式检查包的最新版本

    我希望我的节点包 在 npm 上发布 在新版本可用时提醒用户 如何以编程方式检查已发布软件包的最新版本并将其与当前版本进行比较 Thanks 您可以结合npmview https npmjs com package npmview 用于获取
  • “gulp”不被识别为内部或外部命令

    我正在尝试使用Gulp http gulpjs com and Node Js https nodejs org en 流式传输我的生产过程中缩小和连接 CSS JS 文件的过程 这是我所做的 我安装了Node Js https nodej
  • 如何找到您在服务器中的加入位置

    寻找一种方法来查找您何时按位置加入服务器 例如 如果我是服务器的所有者 我将是 1 因为我先加入 然后如果我在所有者之后加入 我将是 2 如果我在 20 人加入后加入 我将是 21 依此类推 有谁知道如何在 Node Js 中解决这个问题
  • 如何在 Nodejs - mongodb 搜索中对结果进行排序,但是,通过调用动态方法

    我正在 Nodejs 中开发一个 Web 应用程序 通过 mongo 本机连接器连接到 mongodb 在我的一个 js 文件中 我有一个通用方法来调用 find 或 findOne 操作以从 mongodb 集合中检索我需要的任何内容 如
  • 将nodejs Express静态请求重定向到https

    我需要将所有 http 请求重定向到 https 包括对静态文件的请求 My code app use express static dirname public app get function req res if req secure
  • 检查用户是否从后端 Firebase 身份验证登录

    在我的前端 用户使用 Firebase 身份验证浏览器登录 那部分工作得很好 除了 Firebase 后端之外 我还有提供其他内容的 NodeJS 后端 但是 我需要仅向经过身份验证的用户提供内容 我的问题是 有没有办法让我的 NodeJS
  • 通过 Amazon SQS 将压缩文本从 PHP 发送到 NodeJS

    我似乎一直坚持通过 Amazon SQS 将压缩消息从 PHP 发送到 NodeJS 在 PHP 方面我有 SQS gt sendMessage Array QueueUrl gt queueUrl MessageBody gt artic
  • 为 Promise 编写循环的正确方法。

    如何正确构造循环以确保满足以下条件承诺电话和被束缚的记录器 log res 通过迭代同步运行 蓝鸟 db getUser email then function res logger log res this is a promise 我尝
  • python-messaging 无法处理 HTTP 请求

    我正在使用下面的代码尝试使用 python messaging 发送彩信https github com pmarti python messaging blob master doc tutorial mms rst https gith
  • 401 未经授权的帖子回复

    我一直在使用 Angular 模板制作 Node js 网站 但我无法在 DB Mongo 上创建数据 这是代码 节点路由 var Property mongoose model Property var jwt require expre
  • 在java中加密字符串,在node.js中解密,错误:解密失败

    我正在尝试用 java 加密一个字符串 将其发送到我的 node js 服务器 然后解密 但是 当我尝试执行此操作时 尝试解密时会不断出现错误 Java加密 String privateKey someprivatekey String d
  • 使用 Maven 和 Spring REST 配置 Angular 2 项目

    我想将我的小型应用程序从 Angular 1 升级到 Angular 2 我对 Angular 2 和节点配置有点陌生 我的网络应用程序使用 eclipse 和 Maven 问题是我无法使用 Angular 2 进行配置 我应该使用什么目录
  • 角度编译速度慢

    我有一个API in Symfony PHP 我用它来测试postman它就像一个魅力 但当我这样做时ng serve aot optimization应用程序开始构建并且消息compiled successfully 需要一分多钟 当我需
  • 如何强制 tsc 忽略 node_modules 文件夹?

    我正在使用 tsc 构建任务 不幸的是 我总是从节点模块文件夹中收到相同的错误 Executing task node modules bin tsc cmd watch p tsconfig json lt node modules ty
  • 如何清除node.js中的超时

    您好 我们正在使用 node js socket io 和 redis 开发应用程序 我们有这个程序 exports processRequest function request result var self this var time

随机推荐