- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个同时服务于 http 和 ws 的应用程序。用户首先通过 HTTP 登录到 Laravel 服务器。这将返回一个用于允许通过 WS 登录的 JWT。
Ihv 添加了一个 MIDDLEWARE_HANDSHAKE 来获取 token 并向 Laravel 服务器发出请求以询问该 token 是否有效以及用户是否可以访问 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: 'chadd01@example.org',
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 回调中。
如果这不是正确的实现方式,有什么建议吗?
谢谢。
最佳答案
在 SocketCluster 上使用 JWT 的一个重要原因是处理登录和身份验证,您是否考虑过只使用 WS?
看看SocketCluster authentication .
您当前的 HTTP 代码如何检查登录数据,您可以对 WS 执行相同的操作并使用 socket.setAuthToken
设置 token (这是我在我的项目):
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
}
关于node.js - SocketCluster 中间件握手 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42394884/
我正在考虑使用 socketcluster构建实时应用程序。文档非常清楚,但我找不到以编程方式按需创建 channel 的方法。 我的需要是:作为用户,我想调用一个 REST API,它会创建一个 c
这里是 React-native 新手,我正在尝试使用 genymotion 模拟器 (android 6) 启动应用程序,但出现以下错误。 同样在做的 friend 可以启动,没有这个问题。我尝试启
我正在运行 http://socketcluster.io/,我想在文件发生更改时重新启动我的工作程序。但是,nodemon server.js 在尝试重新启动时会立即失败,并出现无休止的重复墙: 1
总的来说,我对 socketcluster 和套接字还很陌生。所以我使用了 https://github.com/devonJS/socket-cluster-chat/ 中的终端聊天示例 我想将其扩
我正在构建一个同时服务于 http 和 ws 的应用程序。用户首先通过 HTTP 登录到 Laravel 服务器。这将返回一个用于允许通过 WS 登录的 JWT。 Ihv 添加了一个 MIDDLEWA
我正在尝试实现这个 solution (在 Win10 x64 上),但由于某种原因,所有 SocketCluster Node 都拒绝相互通信。 所以这是我的坏蛋。配置: 1 个状态服务器 [777
我正在尝试运行 socketcluster-android-client 演示应用程序 (https://github.com/sacOO7/socketcluster-android-demo)。我
我正在尝试设置我的 SocketCluster 应用程序以使用 SSL。我可以在没有 ssl 的情况下在 nginx 上运行它,但不能使用它。每当我在浏览器中访问该站点时,我都会看到 nginx 欢迎
我正在运行一个简单的 socketcluster node.js 服务器并从 node.js websocket 客户端连接到它。 通过在本地 Ubuntu14.04 上运行服务器,我可以将 10,0
假设我正在尝试将我的应用程序扩展到 Node js 应用程序中超过 200k+ 套接字连接,我该如何解决这个问题。我做了很多研究并思考:-应用层-socket.io层-负载均衡器 这是在我阅读了 so
我正在尝试使用 Coinigy websocket api 的代码数据,以获取实时交易流和加密 Assets 的价格。 我尝试了以下演示但没有成功,我得到的响应是: “套接字未通过身份验证” inte
我是一名优秀的程序员,十分优秀!