是否支持WSO2 API管理器Websocket的Socket.io?

是否支持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不会将请求

WSO2 APIM manager中内置的WebSocket API是否支持基于socket.io/nodejs的端点?

我有基于
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服务器,该端点可以正常工作。