SocketCluster 中间件握手与承诺

2024-03-16

我正在构建一个同时服务 http 和 ws 的应用程序。用户首先通过 HTTP 登录 Laravel 服务器。这会返回一个 JWT,用于允许通过 WS 登录。

Ihv 添加了一个 MIDDLEWARE_HANDSHAKE 来获取令牌并向 Laravel Server 发出请求,询问该令牌是否有效以及用户是否有权访问 WS(并非每个登录用户都允许访问 WS);

客户端代码:

var options = {
    host: '127.0.0.1:3000',
    query: {
        source: 'web',
        token: '',
    }
};

var socket;

$.post('http://127.0.0.1:8000/authenticate', {
    email: '[email protected] /cdn-cgi/l/email-protection',
    password: '1234'
}, function(data, textStatus, xhr) {
    options.query.token = data.token;

    //ALL PERFECT UNTILL HERE

    // Initiate the connection to the ws server
    socket = socketCluster.connect(options)
        .on('connect', function(data) {
            console.log('CONNECTED', data);
        })
        .on('error', function(data) {
            console.log('ERROR', data.message);
        });
});

SocketCluster服务器代码:

scServer.addMiddleware(scServer.MIDDLEWARE_HANDSHAKE, function(request, next) {
    var query = url.parse(request.url, true).query;
    switch (query.source) {
        case 'web':
        case 'mobile-app':
            validateUser(query)
                .then((response) => {
                    next(); //Allowed
                })
                .catch((code) => {
                    next(code); //Blocked with StatusCode
                });
            break;

        default:
            next(true, 'NOT_AUTHORIZED'); // Block
            break;
    }
});

validateUser = (credentials = {}) => {
    return new Promise((resolve, reject) => {
        request({ url: API + 'webSocket/users/' + credentials.token, method: 'GET' }, (error, response, body) => {
            if (response.statusCode === 200) {
                resolve(body);
            }
            reject(response.statusCode);
        });
    });

};

在像这样实现这个中间件时,即使验证成功,我也会不断从 ws 服务器收到此响应:

WebSocket connection to 'ws://127.0.0.1:3000/socketcluster/?source=web&token=<_TOKEN_>' failed: Connection closed before receiving a handshake response

(index):149 ERROR Socket hung up

但是,如果我像这样实现HANDSHAKE_MIDDLEWARE:

scServer.addMiddleware(scServer.MIDDLEWARE_HANDSHAKE, function(request, next) {
    var validUser = true;
    if (validUser){
         return next();
    }
    return next('NOT_A_VALID_USER');
});

一切顺利:

CONNECTED Object {id: "W067vqBc9Ii8MuIqAAAC", pingTimeout: 20000, isAuthenticated: true, authToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6I…xOTV9.E4bLPh4Vjk9ULvfhW6prjBbVt0vOD32k63L1vlDtGrU"}

所以问题似乎出在 Promise 回调上。

如果这不是正确的实施方式,有什么建议吗?

Thanks.


在 SocketCluster 上使用 JWT 的一个重要原因是处理登录和身份验证,您是否考虑过只使用 WS?

看一眼SocketCluster 身份验证 http://socketcluster.io/#!/docs/authentication.


您当前的 HTTP 代码如何检查登录数据,您可以对 WS 执行相同的操作并使用socket.setAuthToken设置令牌(这是我在项目中使用的一个例子):

socket.setAuthToken({
    email: credentials.email,
    id: returnedData.id,
    permission: returnedData.permission
});

然后,您可以仍然使用 on/emit 向 WS 服务器发出请求,并检查它们是否经过身份验证。这是我的修改后的片段authCheck功能:

const token = socket.getAuthToken();

if (token && token.email) {
    console.log('Token Valid, User is: ', token.email);
    // user validated - continue with your code
} else {
    console.log('Token Invalid, User not authenticated.');
    // respond with error message to the user
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SocketCluster 中间件握手与承诺 的相关文章

  • 基于 NodeJS 的Radio(不带 ShoutCast)

    我喜欢创建一个基于 NodeJS 的广播电台not使用ShoutCast 基于 NodeJS 的播放列表 目前我已成功将音频文件发送到浏览器 但我不知道如何创建服务器端播放列表它会持续 播放 当前歌曲 并在播放结束后重新开始播放 这就是我目
  • RoboMongo:不显示所有文档

    当我打开集合时 它仅显示前 50 个文档 而不是全部文档 如何使 RoboMongo 显示集合中的所有文档 最好是自动 罗博蒙戈结果 https i stack imgur com K5fn8 png 2019 年 12 月 6 日更新 最
  • 快递+护照+会话。为每个页面加载执行查询

    我正在使用 Express 4 2 0 和 Passport 0 2 0 我使用的express session中间件是1 2 1 我对节点身份验证比较陌生 所以请耐心等待 我注意到 对于每个页面加载 护照正在执行数据库请求 Executi
  • 规则和夏令时

    我在用着rrule https github com jakubroztocil rrule在我的数据库中创建和存储事件 一切正常 直到我发现我的重复事件与 3 月 31 日之后有一个小时的差异 在法国 这一天我们进行夏令时更改 实际上 我
  • ElectronJS 捕获屏幕质量低

    我正在使用 ElectronJS 测试屏幕捕获 我可以捕获屏幕 但捕获的视频质量低于原始视频 操作系统 Linux Mint 20 电子版本 11 1 0 这是我的代码 我选择我的屏幕 然后使用以下命令在电子应用程序中显示捕获的屏幕vide
  • 使用node.js/Express从HTTP重定向到HTTPS

    有什么方法可以更改我的 Web 应用程序以侦听 HTTPS 而不是 HTTP 我正在使用node js express 我需要它来侦听 HTTPS 因为我正在使用地理定位 而 Chrome 不再支持地理定位 除非从 HTTPS 等安全上下文
  • 从字符串中删除货币符号并使用 Javascript 中的单行转换为数字

    我下面有一个字符串 它是以英镑为单位的价格 我想删除货币符号 然后将其转换为我可以用来与另一个值进行比较的数字 价格 例如 X gt Y 14 50 我之前已将字符串转换为用于货币的数字 var priceNum parseFloat pr
  • 在 ExpressJS 中为特定路由链接多个中间件

    我只想验证一些东西 但无法在 Express 文档或在线中找到与此相关的任何内容 尽管我知道这是一个功能 我可以测试一下 但我真的没有一个好的模板 并且希望听到社区的意见 如果我像这样在express中定义一条路线 app get func
  • npm install -D sass-loader node-sass Vue.js 2021

    您好 问题是为 Vue js 设置 SASS 我跑 Node js 15 7 0 Vue js vue cli 4 5 11 这是我在运行此命令时在控制台中遇到的错误 npm install D sass loader 节点 sass np
  • 在 NPM 上捆绑并发布客户端 Web 代码

    我制作了一个 JavaScript 文件 假设它的内容是这样的 let myCoolAlert str gt alert str in a different js file SO doesn t allow you to cross fi
  • 托管 React 应用程序和 Express 服务器 cpanel

    我是托管新手 如果有人可以非常详细地解释 这将对我有很大帮助 我有以下问题 我有前端使用react app和后端使用expressjs and mysql 我的计算机中有一个可以运行的简单应用程序 我使用本地主机启动后端和前端 它们工作完美
  • 为什么 Node.js 命名为 Node.js? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我只是好奇为什么 Node js 这么命名 我搜索了他们的网站和常见问题解答 但没有任何内容可以帮助我理解为什么它被命名为 Node js 官方名称其
  • 使用 Promise 语法编写同步代码有什么好处吗?

    有同步承诺这样的概念吗 使用 Promise 语法编写同步代码有什么好处吗 try foo bar a b bam catch e handleError e 可以写成类似的东西 但使用同步版本then foo then bar bind
  • 我可以在 Node 的标头中发送带有 cookie 的 GET 请求吗?

    在浏览器中 如果我发送 GET 请求 该请求同时会发送 cookie 现在我想模拟Node的GET请求 那么代码怎么写呢 使用奇妙的request https github com mikeal request 默认情况下启用库 cooki
  • node.js - 将两个可读流写入同一个可写流

    我想知道如果您同时将两个不同的读取流传输到同一目的地 node js 会如何操作 例如 var a fs createReadStream a var b fs createReadStream b var c fs createWrite
  • Javascript 中的面向对象方法

    是否可以使用面向对象的方法在 Java 脚本中 我在中使用 JavaScript服务器端和客户端使用node js 当前我正在使用查询来进行CRUD操作而不是查询是否可以使用DTO S将数据保存在数据库中 是的 您可以使用原型继承来模拟它
  • 节点未被识别为内部或外部命令,但位于 PATH 中

    尽管我遵循了以下建议 使用phonegap cordova时 node 不被识别为内部或外部命令 可操作程序或批处理文件 https stackoverflow com questions 23412938 node is not reco
  • 如何在特定天数限制后从温斯顿日志中删除文件?

    我正在使用winston将文件记录到按预期工作的服务器中 现在我想设置天数限制 假设3天后我想删除3天前记录的文件 是否可以使用winston轮换来实现 main js winston add winston transports File
  • Express js 错误:“express 已弃用 res.sendfile:请改用 res.sendFile”

    设置路径的正确方法是什么 在我的应用程序中 我使用此代码设置发送文件的路径 app get function req res get put post delete res sendfile dirname client views ind
  • NPM 全局标志在 Windows 上似乎不一致

    从控制台运行 gt npm root g 或者以编程方式 var npm require npm npm load null function err npm npm config set global true npm root 我在 W

随机推荐

  • 使用 ncurses 时未定义对“stdscr”的引用

    我正在尝试在 Ubuntu 11 10 中编译我的代码并收到这些错误等等 到目前为止 通过谷歌搜索我认为这是一个链接错误 具体来说 有人建议确保您拥有正确的标头并链接 lncurses 库 我已经这么做了 我仍然收到此错误 我还读到也许我应
  • git reset --soft 的实际用途?

    我使用 git 已经有一个多月了 事实上 我昨天才第一次使用重置 但软重置对我来说仍然没有多大意义 我知道我可以使用软重置来编辑提交 而无需更改索引或工作目录 就像我所做的那样git commit amend 这两个命令真的一样吗 rese
  • C++20 范围和排序

    我正在处理 C 20 的最后 4 个大版本 试图学习新的主要功能 尝试来自网络的一些与范围相关的代码 我写了 std vector ints 6 5 2 8 auto even int i return 0 i 2 ranges auto
  • 在 MongoDB 中的对象中插入数组

    我是 MongoDB 的新手 我想像这样插入 mongodb 数据 但我不知道如何做 image cab tags NNP 0 NN 1 image castle tags NNP 2 NN 1 我的代码是 BasicDBObject ob
  • 登录管理后,Django 开发服务器停止

    我已经在 python 3 7 中安装了 django 3 0 并启动了一个基本的 django 项目 我创建了一个超级用户并使用运行开发服务器python manage py runserver 当我去localhost 8000 adm
  • 如何使用 R 将日期时间格式转换为“ddmmyyyy”?

    我的约会dataframe看起来像这样 Date Values 1JAN2018 80 23DEC2019 21 3 我怎样才能将其格式化为ddmmyyyy日期以便我可以使用ggplot创建时间序列图 我做了什么 Date lt as Da
  • 处理父小部件中的点击事件

    在我的应用程序树中 我有两个小部件 GestureDetector onTap gt print Outer child IconButton icon Icon Icons add onPressed gt print Inner 他们都
  • 将 OnClickListener 关闭然后再打开

    我在用户单击按钮后将 OnClickListener 设置为关闭 confirm setOnClickListener null 这使得该按钮不可单击 但我希望在用户单击另一个按钮后它可以单击 我怎样才能做到这一点 Just set con
  • 枚举所有正在运行的数据库

    我正在编写一个小型数据库管理程序 如果您提供数据库 它可以正常工作 但如果您不知道安装了哪个数据库 则效果不佳 如何枚举所有正在运行的数据库 例如程序的输出 Port xy MS SQL Server 2005 Port ab Postgr
  • 没有子元素的 Javascript 元素 html [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在我的 javascript 代码中 我需要获取元素的定义 但没有其内容 既不是文本也不是子元素 例如 为了 div c
  • 如何将十进制基数 (10) 转换为负二进制基数 (-2)?

    我想编写一个程序将十进制转换为负二进制 我不知道如何从十进制转换为负二进制 我不知道如何找到规则以及它是如何运作的 例子 7 base10 gt 11011 base 2 我只知道是这样7 2 0 1 2 1 1 2 2 0 2 3 1 2
  • 如果进程附加了 CLR 调试器,.NET 代码运行速度是否会变慢?

    正如标题所说 我正在运行一个很长的程序 并且它附加了 CLR 调试器 因此我可以捕获和检查异常 我获得的性能是否与不使用调试器运行它相当 或者我是否付出了严重的 2 10 倍或更多 代价 最重要的是 工具 选项 调试 常规 抑制模块加载的
  • Java 中 if/else 与 switch 语句的相对性能差异是什么?

    担心我的 Web 应用程序的性能 我想知道 if else 或 switch 语句中哪一个在性能方面更好 我完全同意过早优化是应该避免的观点 但 Java VM 确实有可用于 switch 的特殊字节码 See WM Spec http d
  • 如何在flutter中使用injectable和get_it的共享首选项?

    我在flutter中使用injectable和get it包 我有一个共同的偏好类别 LazySingleton class SharedPref final String token token SharedPreferences pre
  • 使用 TextMode Number 回发后,TextBox 失去值

    遇到奇怪的问题 我有一个简单的页面TextBox
  • 如何使用 ScalaPB 序列化/反序列化使用“oneof”的 protobuf 消息?

    我正在使用 ScalaPB 编译 Scala 案例类来序列化我的 protobuf 消息 我有一个 proto包含以下消息的文件 message WrapperMessage oneof msg Login login 1 Register
  • AutoMapper 地图子属性也定义了地图

    我有以下域对象 public class DomainClass public int Id get set public string A get set public string B get set 我有以下两个要映射到的对象 pub
  • send() 函数返回的字节数多于 C++ 所需的字节数

    我正在做一个套接字程序 在我的服务器与设备连接后 我试图向他发送一条消息 但 send 函数返回的字节数大于数组中存储的字节数 并且消息没有被发送 这是我的代码 StartSendingMessages int retorno CStrin
  • 是否有任何 jQuery 版本符合 Promise/A 规范?

    在阅读了几篇文章之后 我开始知道 jQuery 中存在 Promise 实现 但我不确定 jQuery 的任何版本是否兼容 Promise A 2015 更新 jQuery 3 0 与 Promises A 兼容 看这个问题在 GitHub
  • SocketCluster 中间件握手与承诺

    我正在构建一个同时服务 http 和 ws 的应用程序 用户首先通过 HTTP 登录 Laravel 服务器 这会返回一个 JWT 用于允许通过 WS 登录 Ihv 添加了一个 MIDDLEWARE HANDSHAKE 来获取令牌并向 La