"MQTT connection refused: not authorized" hatası, broker'ın CONNECT paketinizi aldığı, anladığı ve bu client'ın bağlanamayacağına karar verdiği anlamına gelir. MQTT 3.1.1'de bu CONNACK dönüş kodu 5'tir; MQTT 5'te ise reason code 0x87'dir. Bu rehber, kimlik bilgilerinden ve client ID'lerden port karışıklıklarına ve broker başına hesaplara kadar nedeni bulmanız için adım adım bir kontrol listesi sunuyor ve her adımı komut satırından nasıl test edeceğinizi gösteriyor.
"Not Authorized" Size Gerçekte Ne Söyler?
Hata göründüğünden daha bilgilendiricidir. Bu hatayı alabilmeniz için birkaç şeyin zaten çalışıyor olması gerekir:
- DNS broker host'unu çözümledi.
- TCP bağlantısı, kullanılıyorsa TLS de kuruldu.
- Broker geçerli bir CONNECT paketini ayrıştırdı.
- Protokol sürümü kabul edildi.
Yani ağ sorunsuzdur. Sorun kimlik veya izindir. Araca bağlı olarak farklı ifadelerle göreceksiniz:
| Araç | Tipik mesaj |
|---|---|
| mosquitto_pub / mosquitto_sub | Connection error: Connection Refused: not authorised. |
| Paho Python 2.x | on_connect içinde reason_code değeri Not authorized |
| MQTT.js | Connection refused: Not authorized (err.code === 5) veya MQTT 5 ile reason code 135 |
| Node-RED MQTT node'u | Durum "connecting" gösterir ve log connection refused, not authorized bildirir |
İlgili bir kodu erkenden ayırmakta fayda var. Dönüş kodu 4 (MQTT 5'te 0x86) "bad user name or password" anlamına gelir: kimlik bilgilerinin kendisi eşleşmemiştir. Kod 5 (0x87) daha geniştir: broker bu client'ı bir yetkilendirme nedeniyle reddeder. Bazı broker'lar yanlış parolalar için de 5 döndürür; bu yüzden ikisini de "kimliği kontrol et" olarak ele alın ama tam kodu okuyun. MQTT CONNACK dönüş kodları rehberi her değeri açıklar.
Not Authorized Sorun Giderme Kontrol Listesi
Bu adımları sırayla uygulayın. Çoğu durum 3. adımda çözülür.
- Hangi broker'a bağlandığınızı doğrulayın. Yapılandırıldığını düşündüğünüz değil, kodunuzun çalışma zamanında gerçekten kullandığı host'u ve portu yazdırın. Ortam değişkenleri ve yapılandırma dosyaları sıklıkla birbirini geçersiz kılar.
- Kimlik bilgilerini yeniden kopyalayın. Kullanıcı adını ve parolayı broker'ın kimlik bilgileri sayfasından yeniden yapıştırın. Baştaki veya sondaki boşlukları, kopyalamadan kaynaklanan satır sonlarını ve yer değiştirmiş kullanıcı adı ile parolayı kontrol edin.
- Kimlik bilgilerine ait client ID'yi kullanın. Birçok yönetilen broker, bir client ID'yi verilen hesaba bağlar. Kodunuz rastgele bir ID üretiyor veya başka bir projeden bir ID'yi yeniden kullanıyorsa, parola doğru olsa bile broker onu reddedebilir.
- Kütüphanenin kimlik bilgilerini gönderdiğini kontrol edin. Paho'da
username_pw_set()çağrısıconnect()öncesinde yapılmalıdır. Arduino PubSubClient'taconnect(clientId)değil,connect(clientId, user, pass)aşırı yüklemesini kullanın. - Shell tırnaklamasını kontrol edin.
$,!veya&içeren parolalar Bash tarafından bozulur. Tek tırnak kullanın:-P 'p@ss$word!'. - Portu ve taşıma katmanını doğrulayın. 1883 portu düz TCP, 8883 TLS, 8083 WebSocket ve 8084
/mqttyolu ile güvenli WebSocket'tir. Bir uyuşmazlık genellikle "not authorized" yerine zaman aşımı veya TLS hatası üretir, ancak yanlış yapılandırılmış bir client amaçlanandan farklı bir dinleyici veya ortamla konuşabilir. - Hesabın aktif olduğunu doğrulayın. Kimlik bilgileri yeniden oluşturulmuş, bir broker silinip yeniden yaratılmış olabilir veya üretime karşı staging kimlik bilgilerini kullanıyor olabilirsiniz.
- Bağlantı kotalarını kontrol edin. Planın bağlantı sınırına ulaşıldıysa MQTT 5 client'ları
0x97 Quota exceededalır, ancak bazı 3.1.1 kütüphaneleri her reddi genel olarak gösterir. Aktif bağlantılarınızı sayın. - Döngüde yeniden denemeyi bırakın. Broker'ın bakış açısından her başarısız deneme başarısız bir giriştir. İnceleme yaparken geri çekilin.
Kimlik Bilgilerini Komut Satırından Test Etmek
Aynı kimlik bilgilerini Mosquitto araçlarıyla test ederek uygulamanızı sorundan ayırın. Önce, anonim herkese açık MQTT test broker'ı ile ağ yolunun çalıştığını kanıtlayın:
mosquitto_sub -h broker.connectmq.com -p 1883 -i auth-check-2d9f \
-t "connectmq/demo/2d9f/#" -d -C 1 -W 5
received CONNACK (0) görüyorsanız makineniz broker'a ulaşabiliyor ve MQTT konuşabiliyordur. Ardından özel kimlik bilgilerinizi TLS üzerinden test edin:
mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
-u 'YOUR_USERNAME' -P 'YOUR_PASSWORD' -i 'YOUR_CLIENT_ID' \
-t "test/#" -d -V mqttv5
-V mqttv5 ile bir ret, 3.1.1 kodundan daha belirgin olan MQTT 5 reason code'unu yazdırır. Bu komut bağlanıyor ama uygulamanız bağlanmıyorsa sorun hesapta değil, uygulamanızın yapılandırmasındadır. Bu komut da başarısız oluyorsa sorun kimlik bilgilerinde, client ID'de veya hesaptadır.
Windows'ta --capath aynı biçimde kullanılamaz; bunun yerine bir CA paket dosyasıyla --cafile kullanın veya bir MQTT GUI client'ı ile test edin.
Kodda Düzeltmek
İşte gerçekten kullandığı yapılandırmayı yazdıran ve yetkilendirme hatalarında sonsuza kadar yeniden denemek yerine duran bir Python client'ı:
import os
import ssl
import paho.mqtt.client as mqtt
HOST = os.getenv("MQTT_HOST", "broker.connectmq.com")
PORT = int(os.getenv("MQTT_PORT", "8883"))
USERNAME = os.getenv("MQTT_USERNAME", "YOUR_USERNAME")
PASSWORD = os.getenv("MQTT_PASSWORD", "YOUR_PASSWORD")
CLIENT_ID = os.getenv("MQTT_CLIENT_ID", "YOUR_CLIENT_ID")
print(f"Connecting to {HOST}:{PORT} as user={USERNAME!r} client_id={CLIENT_ID!r}")
def on_connect(client, userdata, flags, reason_code, properties):
if reason_code.is_failure:
print(f"Refused: {reason_code} (0x{reason_code.value:02X})")
if reason_code.value in (0x85, 0x86, 0x87):
print("Identity problem: check username, password and client ID")
client.disconnect()
return
print("Connected")
client = mqtt.Client(
mqtt.CallbackAPIVersion.VERSION2,
client_id=CLIENT_ID,
protocol=mqtt.MQTTv5,
)
client.username_pw_set(USERNAME, PASSWORD)
client.tls_set(cert_reqs=ssl.CERT_REQUIRED)
client.on_connect = on_connect
client.connect(HOST, PORT, keepalive=60)
client.loop_forever()
!r biçimlendirmesi değerleri tırnak içinde yazdırır; bu da görünmez boşlukları belirgin hale getirir. Bu tek satır, "parolam kesinlikle doğru" diye başlayan pek çok incelemeyi çözmüştür.
PubSubClient kullanan bir ESP32'de yaygın hata aşırı yüklemededir:
// Yanlış: hiçbir kimlik bilgisi gönderilmez
mqtt.connect("YOUR_CLIENT_ID");
// Doğru: client ID, kullanıcı adı ve parola
mqtt.connect("YOUR_CLIENT_ID", "YOUR_USERNAME", "YOUR_PASSWORD");
Bağlandıktan Sonra Not Authorized
Bazen bağlantı başarılı olur ama sonraki işlemler "not authorized" ile başarısız olur. MQTT 5'te bir SUBACK'te, PUBACK'te veya bir DISCONNECT'te 0x87 görürsünüz. Bu, client'ın bağlanabildiği ancak belirli bir topic'i, örneğin ayrılmış bir öneki kullanmasına izin verilmediği anlamına gelir. MQTT 3.1.1'de reddedilen bir publish için reason code yoktur; bu yüzden mesaj basitçe kaybolabilir. Mesajlar kayboluyorsa, gerçek reason code'u görmek için geçici olarak MQTT 5 ile bağlanın. MQTT reason code'ları referansı her kodu paket türüne göre listeler.
ConnectMQ'da Bu Nasıl Çalışır?
ConnectMQ'da portalda oluşturduğunuz her broker için bir kullanıcı adı, parola ve client ID üretilir ve client ID bu kimlik bilgilerine bağlanır. 0x87 gördüğünüzde kontrol edeceğiniz ilk şey budur: üç değerin de aynı broker'dan mı geldiği. Broker'lar kiracı başına izole edilmiştir; bu yüzden bir broker'ın kimlik bilgileri, aynı hesap içinde bile başka bir broker'da çalışmaz.
Bilinmesi gereken iki platform davranışı daha var:
- Başarısız girişler hız sınırına tabidir. Tekrarlanan başarısız girişlerden sonra kaynak IP adresi engellenir. Eskimiş kimlik bilgileriyle sıkı bir yeniden bağlanma döngüsüne takılmış bir cihaz, aynı NAT arkasındaki diğer cihazları da kilitleyebilir. Üstel backoff kullanın.
- Bağlantı sınırları plana göredir. Ücretsiz Serverless planı en fazla 25 eş zamanlı bağlantıya izin verir. Bunu aşmak MQTT 5 client'ları için "not authorized" değil
0x97 Quota exceededüretir; bu da hata ayıklarken MQTT 5'i tercih etmenin bir nedenidir.
Kimlik doğrulamanın ötesinde sıkılaştırma için MQTT güvenliği en iyi uygulamaları yazısına, protokolün daha geniş resmi için MQTT eğitimine bakın.
ConnectMQ ile Güvenle Bağlanın
Eşleşen kimlik bilgileri ve client ID'ler veren barındırılan bir MQTT broker, bu hatanın nedenlerinin çoğunu daha oluşmadan ortadan kaldırır. Kredi kartı olmadan ücretsiz bir Serverless broker için app.connectmq.com adresinden kaydolun ve tek bir cihaza firmware yüklemeden önce kimlik bilgilerinizin çalıştığını tarayıcı içi MQTT istemcisiyle doğrulayın. Bulut MQTT broker çalıştırma hakkında daha fazla bilgi edinin.
Sık Sorulan Sorular
Mosquitto araçlarında "Connection Refused: not authorised" ne anlama gelir?
CONNACK dönüş kodu 5'tir. Broker geçerli bir CONNECT almış ama client'ı reddetmiştir; bunun nedeni genellikle yanlış kimlik bilgileri, hesaba bağlı olmayan bir client ID veya başka bir broker'a ait kimlik bilgileridir.
"Not authorized" ile "bad username or password" aynı şey mi?
Tam olarak değil. Bad username or password kod 4'tür (0x86) ve kimlik bilgilerinin eşleşmediği anlamına gelir; not authorized ise kod 5'tir (0x87) ve daha geniş izin sorunlarını kapsar. Bazı broker'lar her ikisi için de kod 5 kullanır; bu yüzden her durumda önce kimlik bilgilerini kontrol edin.
Client'ım neden mosquitto_sub ile bağlanıyor da uygulamamdan bağlanmıyor?
Uygulama farklı bir şey gönderiyordur: başka bir host, üretilmiş bir client ID, eksik kimlik bilgileri veya bozulmuş bir parola. Etkin yapılandırmayı çalışma zamanında yazdırın ve çalışan komutla karşılaştırın.
Tekrarlanan başarısız girişler sorun yaratabilir mi?
Evet. ConnectMQ dahil birçok broker, tekrarlanan başarısız girişlerden sonra IP adreslerini engeller. Üstel backoff kullanın ve yetkilendirme hatalarında yeniden denemeyi bırakın.



