L'API WebSocket intégrée dans le gestionnaire APIM WSO2 prend-elle en charge le point de terminaison basé sur socket.io/nodejs?
J'ai un serveur websocket basé sur socket.io
(dans NodeJS) et un client javascript socket.io, entre les deux, nous utilisons le gestionnaire d'API WSO2 pour authentifier les connexions websocket. Mais WSO2 ne parvient pas à connecter le serveur principal et ne donne rien en réponse. J'ai utilisé le paramètre de requête access_token pour passer le jeton Bearer (à partir du client JavaScript) et cela semble fonctionner comme aucune erreur. Mais WSO2 ne transfère pas les demandes au point de terminaison.
La même chose fonctionne bien avec le client serveur WebSocket natif.
3 Réponses :
Vous pouvez ajouter les journaux suivants à <AM_HOME> /repository/conf/log4j.properties pour déboguer davantage le problème. Pour APIM 3.xx, vous pouvez le modifier selon le log4j2 et l'ajouter à 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
Merci @ruks, maintenant j'ai ces messages d'erreur. Pouvez-vous suggérer ce qui ne va pas? InboundWebsocketSourceHandler Endpoint introuvable pour le port: 9099 domaine client: null . J'ai défini le point de terminaison qui fonctionne bien sans WSO2 entre les deux ou si j'utilise le serveur Websocket principal.
enfin je me débarrasse de ce problème. Oui, WSO2 APIM websocket prend en charge la bibliothèque js socket.io qui sera la première réponse à ma propre requête. Pour en savoir plus, voici quelques résultats.
La raison réelle du problème était le modèle d'URL de demande utilisé par la bibliothèque socket.io et WSO2 APIM. La bibliothèque Socket.io JS crée l'URL finale avec / à la fin de la ressource ( référence ), ce qui n'est pas accepté par la logique de séparation des requêtes utilisée par WSO2.
Donc en simple, c'est acceptable
var socket = io.connect("http://localhost:9099?access_token=90e8sf10-3s1w-495f-b20d-5a009f63193v", { transports: ['websocket', 'polling'], path: '/livefeed/v1', noslash: 'true' });
mais pas ça,
if(typeof opts.noslash!== 'undefined' && opts.noslash== "true"){ _this.opts.path = _this.opts.path.replace(/\/$/, ""); }else{ _this.opts.path = _this.opts.path.replace(/\/$/, "") + "/"; }
Solution:
Après quelques discussions avec l'équipe WSO2, il était clair qu'il était impossible de mettre en œuvre les changements de leur côté. Donc, peu de hack dans le fichier socket.io.js a fonctionné pour moi.
numéro de ligne - 2535
changé cela,
_this.opts.path = _this.opts.path.replace(/\/$/, "") + "/";
pour ça,
ws://localhost:9099/livefeed/v1/?EIO=4&transport=websocket
et créé socket en utilisant un argument supplémentaire.
ws://localhost:9099/livefeed/v1?EIO=4&transport=websocket
Je sais que ce n'est pas une solution réelle, mais cela a fonctionné pour moi.
La réponse précédente était pour le client JS socket.io, voici le même hack pour le client python socket.io.
Modifiez le fichier client.py depuis /home/user/.local/lib/python3.6/site-packages/engineio
ligne no. 515
change ça,
sio.connect('http://localhost:9099', headers={'Authorization':'Bearer 90e8sf10-3s1w-495f-b20d-5a009f63193v'}, transports=['websocket'], socketio_path='/livefeed/v1', noslash='true')
pour ça,
def connect(self, url, headers={}, transports=None, engineio_path='engine.io', noslash=None): self.noslash = noslash
Maintenant, au lieu de modifier directement le flux réel, nous pouvons utiliser un paramètre conditionnel.
if self.noslash == 'true': return ('{scheme}://{netloc}/{path}?{query}' '{sep}transport={transport}&EIO=3').format(...
sinon retourner la déclaration originale.
Le paramètre noslash peut être récupéré à partir de la fonction connect () dans les bibliothèques engineio et socketio de python.
return ('{scheme}://{netloc}/{path}?{query}' '{sep}transport={transport}&EIO=3').format(...
Voici l'exemple de chaîne de connexion pour python-socketio
return ('{scheme}://{netloc}/{path}/?{query}' '{sep}transport={transport}&EIO=3').format(...
peut être dû à une incompatibilité d'en-tête. Y a-t-il des erreurs dans la console?