“Hiç uğraşamam…”

twitter.com/brsyuksel

OAuth

Şu sıralar her ne kadar boyumdan büyük bir iş olsa da, Twittell gibi hoş bir isim verdiğim, Linux için Twitter istemcisi olacak bir uygulama üzerinde çalışıyorum. Aslında çalışıyorum demem doğru olmaz çünkü üniversite kayıt işlemleri 2 haftamı aldı götürdü diyebilirim. Herneyse…

Şimdi basit bir örnek vererek OAuth’a değineyim. Farz edin ki, Twitter.com, FriendFeed.com gibi servisler için bir istemci uygulaması yaptınız. Son kullanıcı uygulamanıza kullanıcı adını ve şifresini girerek geleneksel yetkilendirme ( basic authorization ) yapılıyor ve API’lere erişim hakkı tanınıyor. İşte OAuth’un can alıcı noktasını burada fark edebilirsiniz, “kullanıcı neye güvenerek istemci uygulamaya kullanıcı adı ve şifre gibi özel bilgilerini versin?”

Tahmin edebileceğiniz gibi, OAuth’da son kullanıcının özel bilgileri ile hiçbir şekilde muhattap olmuyorsunuz. Kullanıcı, yetkilendirmeyi istemcinin API’sini kullandığı servis üzerinden yapıyor. Böylece, son kullanıcının özel bilgilerine sahip olmamış oluyorsunuz.

Olay istemci tarafında şu şekilde gerçekleşiyor, API’sini kullanacağınız servise kendi uygulamanızı kayıt ettirerek tanıtıyorsunuz. Servis size iki adet anahtar ( Consumer Key, Consumer Secret ) veriyor. Bu anahtarların ne işe yaradığını ilerki satırlarda anlayacaksınız.

Sonrasında bu anahtarları kullanarak, kullanıcının servis üzerinde giriş yapmasını sağlamak amacıyla, servisten “oauth token” (Token Key, Token Secret) anahtarlarını istiyorsunuz. Elde ettiğiniz oauth token anahtarları ile, kullanıcıyı servise yönlendirip giriş yapmasını ve uygulamanıza servisin API’lerini kullanabilmesi için gereken yetkiyi vermesini istiyorsunuz. Artık son adıma yaklaşıldı. Kullanıcı giriş yaptıktan sonra, kendisine twitter.com’un tanımıyla bir Pin kodu ya da friendfeed.com’un tanımıyla bir “Remote” kod veriliyor. Bu kod ismteciye verilerek ( web tabanlı uygulamalarda geri dönüş adresi “callback url” kullanıldığından dolayı, bu adımı bir nevi atlamanız gerekiyor ) “oauth_verifier” parametresi ile doğrulama amaçlı kullanıyor ve son olarak, artık uygulamamızın için kullanıcının kullanıcı adı ve şifresi yerine geçen, sadece servisin izin verdiği alanlarda kullanabileceğimiz, son anahtarları ediniyoruz. Kısaca, artık bizim için o kullanıcının, kullanıcı adı ve şifresi o anahtarlar.

Son olarak anlatılacak şey, “Consumer Key” ve “Consumer Secret” anahtarlarının ne işe yaradığı. Tahmin edebileceğiniz gibi, bu anahtarlar, son kullanıcının özel bilgileri yerine geçen anahtarların doğrulanmasında, deşifre edilmesinde kullanılıyor. Yani, elde edilen kullanıcı adı ve şifre yerine geçen anahtarlar başka bir şahıs tarafından ele geçirildiğinde, herhangi bir işe yaramıyor, çünkü bu anahtarlar doğrulanırken “Consumer Key” ve “Consumer Secret” anahtarlarına ihtiyaç duyuluyor.

Ben Twittell adlı uygulamamda kullanmak üzere TwittellOAuth adında bir sınıf yazdım. Sınıfı aslında uygulamamda rahatça kullanabilmek için kendime göre yapılandırdım, genel kitleye hitap edecek bir yanı yok diyebilirim. Ancak siz de twitter.com apilerini kullanan bir uygulama yapmayı planlıyorsanız, oauth yetkilendirmesi için TwittellOAuth sınıfını kendinize göre düzenleyerek ya da düzenlemeden basitçe kullanbilirsiniz.Örnek kullanımı şu şekilde:

  1.  
  2. #!/usr/bin/python
  3. #-*- coding:utf-8 -*-
  4.  
  5. from TwittellOAuth import TwittellOAuth
  6. import webbrowser
  7.  
  8. ConsumerKey="consumer_key"
  9. ConsumerSecret="consumer_secret"
  10. #apisini kullanacaginiz servisin verdigi anahtarlar.
  11.  
  12. ornek = TwittellOAuth(ConsumerKey,ConsumerSecret)
  13. """
  14. ConsumerKey ve ConsumerSecret anahtarlarimizi vererek nesnemizi olusturuyoruz.
  15. ornek.consumer.key ve ornek.consumer.secret uyelerine sahip oluyoruz ancak isimiz yok bunlarla :)
  16. """
  17.  
  18. url = ornek.GetPin()
  19. """
  20. bu metot ile TwittellOAuth sinifi, consumer bilgilerimizi kullanarak once servisten izin isteyebilmemiz icin
  21. gereken anahtarlari ediniyor, sonrasinda o anahtarlari kullanarak son kullanicinin yonlendirilecegi
  22. adresi bize donuyor.
  23. """
  24.  
  25. webbrowser.open(url)
  26. """
  27. kullanici tarafindan uygulamamiza gereken yetkiyi vermesi icin, giris yapilacak sayfayi, ontanimla tarayicida aciyoruz.
  28. kullanici giris yaptiktan sonra bir adet pin kodu edinecek.
  29. """
  30.  
  31. oauth_verifier = raw_input("PIN: ")
  32. #kullanicinin edindigi pin kodunu uygulamamiza girmesini istiyoruz.
  33.  
  34. token = ornek.EnterPin(oauth_verifier)
  35. """
  36. sinifa pin kodunu veriyoruz ve sinif bunu "oauth_verifier" parametresi olarak kullanip servisten
  37. kullanicinin kullanici adi ve sifre bilgisi yerine gecen anahtarlari aliyor ve bize teslim ediyor.
  38. artik tamam :) token degiskenimiz artik bir liste. Bu listenin ilk ogesi ( token[0] ) token key,
  39. ikinci ogesi ( token[1] ) token secret. bu verileri kaydederek, ileriki surecte, apilere erismek
  40. icin kullanacagiz. Yani bunca islem, sadece bir defaya mahsus yapiliyor.
  41. """
  42.  
  43. #simdi twitter.com’un status update apisini kullanarak durumumuzu guncelleyelim :)
  44. statusupdateurl = "http://www.twitter.com/statuses/update.json"
  45. status = "oauth ile apiye erisim"
  46. arg = {"status":status} #twitter.com status bilgisini "status" parametresi ile aliyor.
  47. istek = ornek.RequestWithOAuth("POST",statusupdateurl,arg) #islem tamamdir :)
  48. print istek #servisin cevabini, yani verilen ciktiyi yazdiriyoruz.
  49.  
  50.  
  51. """
  52. son olarak tum bunlardan "kismen" bagimsiz bir ornek vereyim.
  53. son kullanicinin kullanici adi ve sifresi yerine gecen token key ve token secret anahtarlarini
  54. edinip veritabaniniza kayit ettiniz. Bunca islemi tekrar yapmadan, kullaniciyi yormadan, kisaca
  55. herhangi bir islem yapmadan, apilere su sekilde eriseceksiniz:
  56. """
  57.  
  58. ConsumerKey="consumer_key"
  59. ConsumerSecret="consumer_secret"
  60. TokenKey = "token_key" #veritabaninizda kayitli token key anahtari
  61. TokenSecret = "token_secret" #veritabaninizda kayitli token secret anahtari
  62.  
  63. ornek2 = TwittellOAuth(ConsumerKey,ConsumerSecret,TokenKey,TokenSecret)
  64. statusupdateurl = "http://www.twitter.com/statuses/update.json"
  65. status = "oauth ile apiye ikinci kez erisim"
  66. arg = {"status":status}
  67. istek = ornek2.RequestWithOAuth("POST",statusupdateurl,arg) #bu kadar :)
  68. print istek #servisin cevabini, yani verilen ciktiyi yazdiriyoruz.
  69.  

TwittellOAuth ve OAuth sınıfı indirmek için tıklayınız.

Bitirirken…
Ben OAuth’u yeterli seviyede ingilizce bilgisine olmadığımdan dolayı, bir çok örnek kodları inceleyerek öğrendim. Sizler oauth.net adresinden daha düzgün ve daha detaylı bir belge okuyarak kolayca bilgi sahibi olabilirsiniz.
Ayrıca burda vermiş olduğum, TwittellOAuth sınıfını ve örnek kullanımını henüz denemedim.Oluşan hatalar sonucunda beni bilgilendirirseniz çok sevinirim.
Twittell adlı uygulamayı yayınladıktan sonra, kısmet olursa oauth’un sunucu tarafında kullanımını inceleyen bir yazı yazmayı planlıyorum, bunun da haberini vermiş olayım :)

Tags: ,
Posted in Python · Eylül 6th, 2009 · Comments (2)

2 Responses to “OAuth”

  1. Cerem Beyazit Says:

    Umarım bir an önce bitirirsin.

  2. brsyuksel Says:

    Yakın zamanda inş. kardeşim.

Leave a Reply

Bağlantılar

Etiketler

çember özel yöntem isimleri apache2screen apache2screen.deb bele kuvvet bi_rle4 brute-force classic classes classmethod descriptors getanurse ic.lnx icontacts ileri c programlama image imagedraw kaba kuvvet kelime tahmin libnotify math math.cos math.sin matruşka matryoshka memory leak mesafe metaclass mysqli new-style classes oauth php5 property pynotify Python singleton special method names staticmethod steganografi steganography super twittell TwittellOAuth wchar yeni stil sınıflar __mro__

Meta