RabbitMQ HTTP Authentication Backend Kullanımı
Merhaba Arkadaşlar ,
Bu blog yazımda rabbitMQ ve mqtt pluginini kullandığımız bir ortamda sisteme bağlanabilecek mqttClientIdlerinin önceden belirlenmiş bir liste ile kontrol altında tutulması için http-auth backendini nasıl kullanacağımızı anlatmaya çalışacağım.
Öncelikle rabbitMQ üzerinde mqtt ve http-auth backend plugilerini enable etmemiz gerekiyor.
Bunun için windows ortamında RabbitMQ server’ın kurulu olduğu dizinde bir command prompt çalıştırıyoruz. Benim bilgisayarımda
1 |
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.9.11\sbin |
dizininde kurulu.
Öncelikle MQTT Pluginini aktive ediyoruz.
1 |
rabbitmq-plugins enable rabbitmq_mqtt |
sonrasında httpauth-backend pluginini enable ediyoruz.
1 |
rabbitmq-plugins enable rabbitmq_auth_backend_http |
Sonrasında ise rabbitMQ config dizinine geçiyoruz.
1 |
C:\Users\{UserName}\AppData\Roaming\RabbitMQ |
burada advanced.config dosyasına aşağıdaki config satırlarını ekliyoruz.
1 2 3 4 5 6 7 8 9 |
[ {rabbit, [{auth_backends, [rabbit_auth_backend_http]}]}, {rabbitmq_auth_backend_http, [{http_method, post}, {user_path, "http://localhost:53729/auth/user"}, {vhost_path, "http://localhost:53729/auth/vhost"}, {resource_path, "http://localhost:53729/auth/resource"}, {topic_path, "http://localhost:53729/auth/topic"}]} ]. |
buradaki user,vhost,resource,topic pathleri bizim authentication yapacağımız external API’yi işaret ediyor. Burada bir .net core API’yi ayağa kaldırıyoruz.
Örnek API’leri bulabileceğimiz githubReposu
1 |
https://github.com/rabbitmq/rabbitmq-auth-backend-http/tree/master/examples |
ben buradaki netcore API’yi kullandım.
Burada dikkat edeceğimiz konu CheckUser fonksiyonunun aldığı UserAuthRequest nesnesini MQTT’de de kullanabilmek için modifiye etmek.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[Route("user")] [HttpPost] public IActionResult CheckUser([FromForm]UserAuthRequest request) { var tags = new [] {"administrator", "management"}; try { var userlog = string.Format("user : {0}, password : {1}", request.UserName, request.Password); _logger.LogInformation(userlog); if (request.UserName == "authuser") //Sample check you can put your custom logic over here return AuthResult.Deny(); } catch (Exception ex) { //check or log error } return AuthResult.Allow(tags); } |
Nesnemize bir yeni alan eklediğimiz zaman son hali aşağıdaki gibi oluyor.
1 2 3 4 5 6 |
public class UserAuthRequest { public string UserName { get; set; } public string Password { get; set; } public string client_id { get; set; } } |