4/19/2013

Masaüstü uygulamaları için OAuth

Bugüne kadar OAuth'u hep web tabanlı uygulamalarda kullandığım için karşılaşmadığım bir detay bugün masaüstü uygulaması geliştirirken karşıma çıktı. Normal bir OAuth senaryosunda giriş yaptırmak istediğimiz siteye kullanıcıyı yönlendirip bir callback adresi üzerinden sitenin bize gönderdiği bilgileri alıp doğruladıktan sonra yetkilendirmeyi tamamlarız, fakat bu senaryo bir masaüstü uygulamasında yaşandığında ne yazık ki  bir callback adresimiz olmuyor. Bu durumda aklıma gelen çözümleri şu şekilde listeledim ve durumuma en uygun çözümü seçmeye çalıştım.

  • Sunucu üzerinde çalışan bir web sayfasını aracı olarak kullanmak: Bulduğum çözümler içerisinde aklıma ilk gelen ve en sağlıklı olanı buydu. tüm OAuth iletişimini "foobar.com/callback" gibi bir sunucuya yaptırıp işlem tamamlandıktan sonra gerekli token'ı alabilirdim, fakat benim geliştirdiğim uygulamanın sabit bir web sayfası olmadığından ve olur da bir gün bu sayfanın adresi değişirse uygulamayı kimse kullanamayacağından bu seçeneği elemek zorunda kaldım.
  • Callback adresi olarak "localhost:4578" gibi bir adres kullanıp bu portu dinlemek: Bu çözümün mantıklı gelmemesinin sebebi ise kullanıcının sistemiyle ilgili yeterli bilgiye sahip olmamam, kullanıcı herhangi bir güvenlik yazılımı kullanıyor mu ve bu yazılım port dinlememe izin verecek mi? ya da kaçıncı denemede ve hangi aralıkta boş bir port bulabilirim? Bu belirsizliğin yanında bir de ayrı bir thread üzerinde HTTP sunucu çalıştırma gerekliliği beni bu çözümden de uzaklaştırdı.
  • Tüm trafiği bir proxy üzerinden geçirip callback olarak belirlediğim sahte bir adresin sorgulanıp sorgulanmayacağını tespit etmek: Bu da oldukça sağlıklı gibi görünen bir çözüm olsa da bir proxy kodunu alıp projeye adapte etmek zaman olarak çok maliyetli olacaktı. (2 hafta kaybım olduğunu düşünürsek)
  • Yetkilendirme sayfasını uygulamaya gömülü WebKit ile açıp,  Proxy örneğinde olduğu gibi belirlediğim sahte bir adresi yüklemeye çalışıp çalışmayacağına bakmak: Bu örnek proxy'den sonra aklıma geldi en başta çok mantıklı görünmese de içlerinden en pratiği benim kanaatimce bu oldu. Şurada göreceğiniz gibi, callback adresi olarak http://en-linuxclipper/ verip, WebKit sayfaları açmadan önce tetiklenen olayların bir tanesinde açmak istediği benim callback adresim mi diye bakıyorum, eğer benim adresim ise oauth_verifier parametresini elde edip yetkilendirme işlemime devam ediyorum.
Bu sorunu böyle çözdükten sonra fartkettiğim ikinci detay ise ilk çözüm haricindekilerin şöyle bir eksiğinin var olması. Geliştiriciye ait keyler uygulama kodları içerisinde yer almak zorunda. Bunun ne kadar güvenlik zaafiyeti oluşturduğunu anlamak için biraz Evernote dökümanlarında gezindim, pek fikir edinemedim. Sonra Evernote ile çalışan benzer bir özgür yazılımda da bu keylerin açıkta durduğunu görünce bunun tehlikeli bir güvenlik zaafiyeti oluşturmadığını anlayıp rahat bir nefes aldım. Tabi Evernote servisi üzerinde bu keyler ile yetkilendirme harici çok bir şey yapılmaması diğer servislerde de böyle olacağı anlamına gelmiyor. Geliştirici keylerini bir özgür yazılımda açık şekilde dağıtmadan önce iyice araştırmakta fayda var.

0 yorum:

Yorum Gönder