Başlamadan önce benim bilgisayarım Windows 10 Pro ve VMWare Workstation Pro yazılımı var ki anında sanal makinalar oluşturup kuruyorum.. Örneğin Debian 9 image ını indirip sanal makine oluştur deyip hafıza, mikro işlemci core sayısı network vb ile hard disk kapasitesini seçip image yani Debian 9 işletim sisteminin kurulum image ının yerini de söleyip bitiriyorum.. Ve makinayı şimdi aç deyince işletim sistemini otomatik yüklüyor.. Bu kadar kolay..
Öncelikle bir Linux veya Linux türevi işletim sistemine ki ben Debian 9 u tercih ediyorum Ejabberd Server ı kuralım.. internette milyon bilgi var bunun nasıl kurulacağı ile ilgili onu da söyleyeyim..
Sonra MySql i tercih ettim ben ve bunu kurun bu da kolay.. MSSQL ile bağlantısı oldukça sorunlu ve zaten bazı sistemlerde desteklemiyor ona göre.. Sonra MySQL in Workbench 8.0 yazılımını kurun ki bu Microsoft SQL Server Management Studio benzeri yazılım işi de çok kolaylaştırıyor..
Şimdi EJabberd Mysql Schema sını Ejabberd web sitesinden alın.. Bunun için sanal makinanızda ki Debian işletim sisteminin içinde Firefox internet browser var oradan yapın bu işi.. Schema yı kopyalayın tabii bu arada MySQL Workbench i de yüklemiş olun.. Linux yani debian ın Shell inde mysql –u root –p yazarak ve şifreyi girerek MySQL e girin ve orada bir veritabanı oluşturun bir de root harici bir kullanıcı yani DB kullanıcısı oluşturun.. Bu gerekli çünkü özellikle LINPHONE vb yazılımların kurulması ve çalışmasında root istenmiyor !..
Sonra Workbench e girin ve bu oluşturduğunuz veritabanını bulup seçip default yapın.. Sağdaki Query penceresine firefox dan Ejabberd web sitesine girip kopyaladığınız database Schema sını buraya paste yapın.. ve çalıştırın.. (Nasıl çalıştırılır vs vs anlatmıyorum öğrenin yani !)
Çok sayıda tablo oluştuğunu göreceksiniz..
EJabberd tamam (mı acaba) ve MySql de yüklendi veritabanı da var oh ne güzel işimiz bitti değil mi? Bu daha yüzde 1 bile değil söyleyeyim…
Öncelikle henüz Ejabberd ı MySQl e bağlamadık ! Yani bağlamak ne demek?
Ejabberd ın /etc/ejabberd/ejabberd.yml ayar dosyasında ayarları değiştirmemiz gerekiyor.. Çünkü Ejabberd default olarak authentication için kendi internal db si olan MNESIA ile çalışıyor.. Bizim bunu MySQL yapmamız lazım ki zaten ilgili veritabanlarını oluşturmuştuk.. Ayar dosyasında hem authentication hem de tüm işlemleri MNESIA yerine MySQL ile yap demek için ayarları buna göre yapacaksınız ! Bunu yani MySQL e bağlantıyı anlatan çok yer var.. Ama bu authentication için biz aynı zamanda tüm işlemlerin MySql de olmasını istersek default_db: sql yazmamız gerekiyor yml dosyasına diğer ayarlara ek olarak..
Sonra systemctl start ejabberd.service ile ejabberd ı başlatın.. Hata gelirse journalctl –xe yazarak hatalari görebilirsiniz.. Hatalari düzeltin ve giderin..
Bu ayarları yaptıktan sonra test yapmak kolay.. ejabberdctl register “kullaniciadi” “serveradi” “sifre”
İle bir kullanici oluşturun.. olumlu cevap gelirse tamamdir..
Simdi elimizde Ejabberd Server ve MySql var ve biraz bağladık onlari..
Biz ne yapmak istiyoruz ? IM yani Chat ile dosya paylaşımlarını Ejabberd dan yapmak görüntülü görüşme vb ise SIP Proxy Server tarafta yapmak istiyoruz.. O halde ;
Ejabberd ı anlatalım biraz.. Bunun bir API tarafı ve Authentication tarafı bizi daha çok ilgilendiriyor.. Normalde authentication ı Ejabberd tarafta yaparsınız ve Ejabberd ın iç komutlarını da uzaktan kullanmak için (Register vb) API sini kullanırsınız.. Biz ise Internal authentication yerine external authentication ı kullanmak istiyoruz.. Ayrıca belki Access token da kullanacağız.. O zaman da Ejabberd ın API sine ek kendi http API mizi yapmalıyız ki önce auth yapmalı gelen mesaj OK ise Access token ı bu http API den istemeliyiz ve işimize bununla devam etmeliyiz.. Belki de biz kişiye mobil den telefonunu gir deyip ona bir Confirmation key yollayacak ve onu girdikten sonra auth tamam nasılsa (şifre ye gerek yok zaten gönderdiğimiz key i girdi ya) o zaman Access token ver demeliyiz (ya gördünüz mü onu işte bu kendi http API mizden isteyebiliriz..) Token varsa Ejabberd external script (şimdi anlatacağım) e buna göre kod yazıp bakmanız mümkün..
Sonuçta yazılım tasarımınız ne olacak ona göre bunlardan biri veya bir kaçını yapmalısınız..
Ejabberd External Auth a dönelim.. YML ayar dosyasında auth_method u external auth yapıp altına da bunu hangi script yani kod ile yapacağımızı yazacağız.. Örneğin bilmemne.PHP veya bilmemne.PY veya bilmemne.CS diye bir çok dilde yazabilirsiniz..
Peki bu Ejabberd auth mekanizması nasıl çalışıyor diye internete baktığınızda çok dokuman ama az ipucu görürsünüz !..
Hadi bunu da anlatalım !..
Siz kendi seçeceğiniz bir dilde bu authentication kodlarını bir kurala göre kodlamalısınız.. kural şu ejabberd bu script in infinite loop yani sonsuz döngü olmasını ister.. ilginç !.. İçinde der ki ben önce 2 byte okurum bu 2 bayt benim sana olumlu ya da olumsuz geri dönüşümün alanları dır geri kalanlar ise yapacağın işlemin kısa adı ve kullanıcı adı ana server ve şifre dir.. Bunları o kodlamada uygun şekilde bana gönder der..
Yani örnek olarak {“opcode”:isuser ,”user”: user, “host”: host, “password”: password_hash(password)} gibi bir veri yapısında yollamanız lazım. Opcode isuser, auth ve setpass olarak 3 tane kullanılabiliyor..
Bu external auth mekanizması için örneğin php ile yazdınız. adi da auth.php o zaman shell den php /path/auth.php yazip deneyin.. size stdin den giriş ister bekler.. iki bosluk yazip isuser:testhesap:localhost diye yazip enter yapin bu arada ejabberd in log larini da tail linux komutu ile açın bakın neler oluyor ! örneğin :
tail -f /var/log/ejabberd/ejabberd.log
dönüş degerleri vb her seyi gorur hatta kod ve ayarlarınızda hata varsa duzeltebilirsiniz..
Mobil tarafta ise kütüphane ile örneğin Android de Smack client ile ejabberd xmpp ye connect olup login olmaya çalistiginizda yine bu log penceresi acik olsun gorursunuz her detayi..
Ancak bazen bu ejabberd external auth oldukça baş ağrısı da veriyor ayarlama yaparken.. cok uğraştırabilir.. Sonuç olarak kayıtları mobil tarafta ejabberd dan değil linphone xmlrpc ile giriyoruz ama auth işini de ejabberd i ilgili veritabanının ilgili tablosuna bağlayıp select atıp bakıyoruz olay bu !..
Bu iş OK ise o zaman diğer aşamaya geçebilirsiniz isterseniz yani Access token vs vs.. Kişi de mesela android tarafta shared preferences da Access token varsa authentication yapmanıza gerek yok değil mi? Burası önemli ? : ) Scooter yazılım mühendisleri bu Access token olayı ile sistemlerinin hack edilemeyeceğini söylediler ama ben yaptım ve bir türlü kabul etmediler anlattım anlattım sonunda kabul ettiklerini düşünüyorum.. o zaman Access token olayını güvenli görmeyin ama çözümü de var.. Hadi siz bulun onu da !..
Bir sonraki bölümde artık LINPHONE altyapısına geçiyoruz
Selcuk Celik