VerneMQ Connexion MQTT perdue (8) : AMQJS0008I Socket closed. différents points de montage

Dans ma configuration, je réécris les points de montage des clients à partir de ceux mis en place par les listeners vers des points de montage individuels en fonction du groupe de clients.

L'idée sous-jacente est d'isoler parfaitement la multi-tenance sur le serveur. Les clients individuels de différents groupes ne peuvent donc pas se voir les uns les autres, même en s'abonnant à "#" (tout).

Dans mon webhook auth_on_register, je vérifie si le client qui essaie de s'enregistrer vient du web (dans le cadre de l'interface utilisateur de picockpit) ou du client Raspberry Pi. À ce stade, le point de montage est toujours déterminé par le listener, car il n'a pas encore été réécrit.

Dans le webhook (dans Crystal) je définir le nouveau point de montagecomme ceci :

res = %({"result" : "ok", "modifiers" : {"mountpoint" : "#{mountpoint}", "client_id" : "#{clientid}"}})

Aujourd'hui, j'ai essayé de comprendre pourquoi le client JS ne pouvait pas publier de messages. Il se déconnectait avec l'erreur :

Perte de la connexion MQTT (8) : AMQJS0008I Socket fermé.

Voici ce que je vois comme sortie de débogage de VerneMQ :

"12:13:33.630 [error] can't auth publish [<>,{"...",<>},0,[<>],<>,false] due to not_authorized"

Cela m'a d'abord déconcerté. Je vérifiais le "bon" point de montage (client javascript), je pensais ?

Et, mon webhook pour auth_on_publish n'a jamais été appelé ?

Il s'avère que, que j'ai oublié de considérer que le nouveau point de montage était déjà défini! Et ce nouveau point de montage est pas une construction virtuelle, mais le nouveau point de montage réel - toutes les demandes de ce client porteront sur ce nouveau point de montage !

Par conséquent : assurez-vous que dans votre fonction Lua auth_on_publish(pub) vous vérifiez le nouveau point de montageavant de passer au gestionnaire suivant (webhook).