EMQX has several auth modules. We use the Mnesia auth module with HTTP API client id provisioning. They also have NanoMQ, a MQTT broker for IoT edge (on resource constrained devices). The documentation is also quite decent compared to this.
Shameless plug since i'm a contributor but VerneMQ [1] is a pretty programmable one. You have options from using webhooks to writting your plugins in Lua or Erlang/Elixir.
https://www.emqx.io/docs/en/latest/access-control/authn/auth...
They have a community edition available as a docker image or packages for popular Linux distros.
https://www.emqx.com/en/try?product=broker