VerneMQ Connessione MQTT persa (8): AMQJS0008I Socket chiuso. punti di montaggio diversi

Nella mia configurazione, sto riscrivendo i punti di montaggio dei client da quelli impostati dagli ascoltatori a punti di montaggio individuali a seconda del gruppo di client.

L'idea alla base di questo è il perfetto isolamento della multi-tenancy sul server. I singoli client di gruppi diversi non sono quindi in grado di vedersi l'un l'altro, anche quando si iscrivono a "#" (tutto).

Nel mio webhook auth_on_register sto controllando se il client che cerca di registrarsi proviene dal web (come parte dell'interfaccia utente di picockpit) o dal client Raspberry Pi. A questo punto il punto di montaggio è ancora determinato dall'ascoltatore, poiché non è stato ancora riscritto.

Nel webhook (in Crystal) ho imposta il nuovo punto di montaggio, come questo:

res = %({"risultato": "ok", "modificatori": {"mountpoint": "#{mountpoint}", "client_id": "#{clientid}"}})

Oggi stavo debuggando perché il client JS non poteva pubblicare alcun messaggio. Si disconnetteva con l'errore:

Connessione MQTT persa (8): AMQJS0008I Presa chiusa.

Ecco cosa vedo come output di debug di VerneMQ:

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

Questo mi ha lasciato inizialmente perplesso. Stavo controllando il punto di montaggio "corretto" (client javascript), pensavo?

E il mio webhook per auth_on_publish non è mai stato chiamato?

Si è scoperto, che ho dimenticato di considerare che il nuovo punto di montaggio era già impostato! E questo nuovo punto di montaggio è non un qualche costrutto virtuale, ma il nuovo punto di montaggio effettivo - qualsiasi richiesta da questo cliente porterà quel nuovo punto di montaggio!

Quindi: assicuratevi che nella vostra funzione Lua auth_on_publish(pub) state controllando il nuovo punto di montaggioprima di passare al gestore successivo (webhook).