是否支持WSO2 API管理器Websocket的Socket.io?
WSO2 APIM manager中内置的WebSocket API是否支持基于socket.io/nodejs的端点? 我有基于是否支持WSO2 API管理器Websocket的Socket.io?,websocket,socket.io,wso2-am,Websocket,Socket.io,Wso2 Am,WSO2 APIM manager中内置的WebSocket API是否支持基于socket.io/nodejs的端点? 我有基于socket.io的websocket服务器(在NodeJS中)和socket.iojavascript客户端,在这两者之间,我们使用WSO2 API管理器来验证websocket连接。但WSO2无法连接后端服务器,并且没有给出任何响应。 我使用了access\u-token查询参数来传递承载令牌(来自JavaScript客户端),它似乎没有错误。但WSO2不会将请求
socket.io
的websocket服务器(在NodeJS中)和socket.iojavascript客户端,在这两者之间,我们使用WSO2 API管理器来验证websocket连接。但WSO2无法连接后端服务器,并且没有给出任何响应。
我使用了access\u-token查询参数来传递承载令牌(来自JavaScript客户端),它似乎没有错误。但WSO2不会将请求转发到端点
同样适用于本机WebSocket服务器客户端。您可以将以下日志添加到/repository/conf/log4j.properties以进一步调试该问题。 对于APIM 3.x.x,您可以根据log4j2更改它并添加到log4j2.properties
log4j.logger.org.wso2.carbon.inbound.endpoint.protocol.websocket.InboundWebsocketSourceHandler=DEBUG log4j.logger.org.wso2.carbon.inbound.endpoint.protocol.websocket.InboundWebsocketResponseSender=DEBUG
log4j.logger.org.wso2.carbon.websocket.transport.WebSocketClientHandler=DEBUG
log4j.logger.org.wso2.carbon.websocket.transport.WebsocketTransportSender=DEBUG
我终于摆脱了这个问题是的,WSO2 APIM websocket支持socket.io js库,这将是我自己查询的第一个答案。关于这一点,以下是一些发现 问题的实际原因是socket.io库和WSO2 APIM使用的请求URL模式。Socket.io JS library在resource()末尾使用/生成最终URL,WSO2使用的查询分离逻辑不接受该URL 简单来说,这是可以接受的
ws://localhost:9099/livefeed/v1?EIO=4&transport=websocket
但不是这个
ws://localhost:9099/livefeed/v1/?EIO=4&transport=websocket
解决方案:
在与WSO2团队进行了几次讨论之后,很明显,不可能在最终实现更改。所以socket.io.js文件中的一些小技巧对我很有用
行号-2535
改变了这个,
_this.opts.path = _this.opts.path.replace(/\/$/, "") + "/";
对此,
if(typeof opts.noslash!== 'undefined' && opts.noslash== "true"){
_this.opts.path = _this.opts.path.replace(/\/$/, "");
}else{
_this.opts.path = _this.opts.path.replace(/\/$/, "") + "/";
}
return ('{scheme}://{netloc}/{path}?{query}'
'{sep}transport={transport}&EIO=3').format(...
并使用额外参数创建套接字
var socket = io.connect("http://localhost:9099?access_token=90e8sf10-3s1w-495f-b20d-5a009f63193v", { transports: ['websocket', 'polling'], path: '/livefeed/v1', noslash: 'true' });
我知道这不是一个实际的解决方案,但它对我很有效。前面的答案是针对socket.io JS客户端的,下面是针对socket.io python客户端的相同攻击 从/home/user/.local/lib/python3.6/site-packages/engineio修改client.py文件 第515行 改变这个,
return ('{scheme}://{netloc}/{path}/?{query}'
'{sep}transport={transport}&EIO=3').format(...
对此,
if(typeof opts.noslash!== 'undefined' && opts.noslash== "true"){
_this.opts.path = _this.opts.path.replace(/\/$/, "");
}else{
_this.opts.path = _this.opts.path.replace(/\/$/, "") + "/";
}
return ('{scheme}://{netloc}/{path}?{query}'
'{sep}transport={transport}&EIO=3').format(...
现在,我们可以使用条件参数,而不是直接修改实际流
if self.noslash == 'true':
return ('{scheme}://{netloc}/{path}?{query}'
'{sep}transport={transport}&EIO=3').format(...
否则返回原始语句
noslash参数可以从python的engineio和socketio库中的connect()函数中获取
def connect(self, url, headers={}, transports=None,
engineio_path='engine.io', noslash=None):
self.noslash = noslash
下面是python socketio的连接字符串示例
sio.connect('http://localhost:9099', headers={'Authorization':'Bearer 90e8sf10-3s1w-495f-b20d-5a009f63193v'}, transports=['websocket'], socketio_path='/livefeed/v1', noslash='true')
可能是由于标头不匹配。控制台中有错误吗?谢谢@ruks,现在我得到了这些错误消息。你能提出什么问题吗?未找到端口:9099租户域:null的InboundWebsocketSourceHandler终结点。我已经定义了端点,如果中间没有WSO2,或者如果我使用核心Websocket服务器,该端点可以正常工作。