<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Barış Yüksel &#187; oauth</title>
	<atom:link href="http://www.brsyuksel.com/tag/oauth/feed" rel="self" type="application/rss+xml" />
	<link>http://www.brsyuksel.com</link>
	<description>"Hiç uğraşamam..."</description>
	<lastBuildDate>Wed, 28 Jul 2010 12:00:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>OAuth</title>
		<link>http://www.brsyuksel.com/oauth.html</link>
		<comments>http://www.brsyuksel.com/oauth.html#comments</comments>
		<pubDate>Sat, 05 Sep 2009 23:35:13 +0000</pubDate>
		<dc:creator>brsyuksel</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[TwittellOAuth]]></category>

		<guid isPermaLink="false">http://www.brsyuksel.com/?p=47</guid>
		<description><![CDATA[Ş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&#8230; Şimdi basit bir örnek vererek OAuth&#8217;a değineyim. Farz edin ki, Twitter.com, FriendFeed.com gibi servisler [...]]]></description>
			<content:encoded><![CDATA[<p>Ş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&#8230;</p>
<p>Şimdi basit bir örnek vererek OAuth&#8217;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&#8217;lere erişim hakkı tanınıyor. İşte OAuth&#8217;un can alıcı noktasını burada fark edebilirsiniz, &#8220;kullanıcı neye güvenerek istemci uygulamaya kullanıcı adı ve şifre gibi özel bilgilerini versin?&#8221;<span id="more-47"></span></p>
<p>Tahmin edebileceğiniz gibi, OAuth&#8217;da son kullanıcının özel bilgileri ile hiçbir şekilde muhattap olmuyorsunuz. Kullanıcı, yetkilendirmeyi istemcinin API&#8217;sini kullandığı servis üzerinden yapıyor. Böylece, son kullanıcının özel bilgilerine sahip olmamış oluyorsunuz.</p>
<p>Olay istemci tarafında şu şekilde gerçekleşiyor, API&#8217;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.</p>
<p>Sonrasında bu anahtarları kullanarak, kullanıcının servis üzerinde giriş yapmasını sağlamak amacıyla, servisten &#8220;oauth token&#8221; (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&#8217;lerini kullanabilmesi için gereken yetkiyi vermesini istiyorsunuz. Artık son adıma yaklaşıldı. Kullanıcı giriş yaptıktan sonra, kendisine twitter.com&#8217;un tanımıyla bir Pin kodu ya da friendfeed.com&#8217;un tanımıyla bir &#8220;Remote&#8221; kod veriliyor. Bu kod ismteciye verilerek ( web tabanlı uygulamalarda geri dönüş adresi &#8220;callback url&#8221; kullanıldığından dolayı, bu adımı bir nevi atlamanız gerekiyor ) &#8220;oauth_verifier&#8221; 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.</p>
<p>Son olarak anlatılacak şey, &#8220;Consumer Key&#8221; ve &#8220;Consumer Secret&#8221; 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 &#8220;Consumer Key&#8221; ve &#8220;Consumer Secret&#8221; anahtarlarına ihtiyaç duyuluyor.</p>
<p>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:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/python</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#-*- coding:utf-8 -*-</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">from</span> TwittellOAuth <span class="kw1">import</span> TwittellOAuth</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">webbrowser</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ConsumerKey=<span class="st0">&quot;consumer_key&quot;</span></div>
</li>
<li class="li1">
<div class="de1">ConsumerSecret=<span class="st0">&quot;consumer_secret&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">#apisini kullanacaginiz servisin verdigi anahtarlar.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ornek = TwittellOAuth<span class="br0">&#40;</span>ConsumerKey,ConsumerSecret<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;&quot;</span><span class="st0">&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">ConsumerKey ve ConsumerSecret anahtarlarimizi vererek nesnemizi olusturuyoruz.</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0">ornek.consumer.key ve ornek.consumer.secret uyelerine sahip oluyoruz ancak isimiz yok bunlarla <img src='http://www.brsyuksel.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;</span><span class="st0">&quot;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">url = ornek.<span class="me1">GetPin</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;&quot;</span><span class="st0">&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0">bu metot ile TwittellOAuth sinifi, consumer bilgilerimizi kullanarak once servisten izin isteyebilmemiz icin</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">gereken anahtarlari ediniyor, sonrasinda o anahtarlari kullanarak son kullanicinin yonlendirilecegi</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">adresi bize donuyor.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;</span><span class="st0">&quot;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw3">webbrowser</span>.<span class="kw2">open</span><span class="br0">&#40;</span>url<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;&quot;</span><span class="st0">&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">kullanici tarafindan uygulamamiza gereken yetkiyi vermesi icin, giris yapilacak sayfayi, ontanimla tarayicida aciyoruz.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">kullanici giris yaptiktan sonra bir adet pin kodu edinecek.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;</span><span class="st0">&quot;&quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">oauth_verifier = <span class="kw2">raw_input</span><span class="br0">&#40;</span><span class="st0">&quot;PIN: &quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#kullanicinin edindigi pin kodunu uygulamamiza girmesini istiyoruz.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">token</span> = ornek.<span class="me1">EnterPin</span><span class="br0">&#40;</span>oauth_verifier<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0">&quot;&quot;</span><span class="st0">&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">sinifa pin kodunu veriyoruz ve sinif bunu &quot;</span>oauth_verifier<span class="st0">&quot; parametresi olarak kullanip servisten</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">kullanicinin kullanici adi ve sifre bilgisi yerine gecen anahtarlari aliyor ve bize teslim ediyor.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">artik tamam <img src='http://www.brsyuksel.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  token degiskenimiz artik bir liste. Bu listenin ilk ogesi ( token[0] ) token key, </span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">ikinci ogesi ( token[1] ) token secret. bu verileri kaydederek, ileriki surecte, apilere erismek</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0">icin kullanacagiz. Yani bunca islem, sadece bir defaya mahsus yapiliyor.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;</span><span class="st0">&quot;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#simdi twitter.com&#8217;un status update apisini kullanarak durumumuzu guncelleyelim <img src='http://www.brsyuksel.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></div>
</li>
<li class="li1">
<div class="de1">statusupdateurl = <span class="st0">&quot;http://www.twitter.com/statuses/update.json&quot;</span></div>
</li>
<li class="li2">
<div class="de2">status = <span class="st0">&quot;oauth ile apiye erisim&quot;</span></div>
</li>
<li class="li1">
<div class="de1">arg = <span class="br0">&#123;</span><span class="st0">&quot;status&quot;</span>:status<span class="br0">&#125;</span> <span class="co1">#twitter.com status bilgisini &quot;status&quot; parametresi ile aliyor.</span></div>
</li>
<li class="li1">
<div class="de1">istek = ornek.<span class="me1">RequestWithOAuth</span><span class="br0">&#40;</span><span class="st0">&quot;POST&quot;</span>,statusupdateurl,arg<span class="br0">&#41;</span> <span class="co1">#islem tamamdir <img src='http://www.brsyuksel.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">print</span> istek <span class="co1">#servisin cevabini, yani verilen ciktiyi yazdiriyoruz.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;&quot;</span><span class="st0">&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">son olarak tum bunlardan &quot;</span>kismen<span class="st0">&quot; bagimsiz bir ornek vereyim.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">son kullanicinin kullanici adi ve sifresi yerine gecen token key ve token secret anahtarlarini</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">edinip veritabaniniza kayit ettiniz. Bunca islemi tekrar yapmadan, kullaniciyi yormadan, kisaca</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0">herhangi bir islem yapmadan, apilere su sekilde eriseceksiniz:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;</span><span class="st0">&quot;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ConsumerKey=<span class="st0">&quot;consumer_key&quot;</span></div>
</li>
<li class="li1">
<div class="de1">ConsumerSecret=<span class="st0">&quot;consumer_secret&quot;</span></div>
</li>
<li class="li2">
<div class="de2">TokenKey = <span class="st0">&quot;token_key&quot;</span> <span class="co1">#veritabaninizda kayitli token key anahtari</span></div>
</li>
<li class="li1">
<div class="de1">TokenSecret = <span class="st0">&quot;token_secret&quot;</span> <span class="co1">#veritabaninizda kayitli token secret anahtari</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ornek2 = TwittellOAuth<span class="br0">&#40;</span>ConsumerKey,ConsumerSecret,TokenKey,TokenSecret<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">statusupdateurl = <span class="st0">&quot;http://www.twitter.com/statuses/update.json&quot;</span></div>
</li>
<li class="li2">
<div class="de2">status = <span class="st0">&quot;oauth ile apiye ikinci kez erisim&quot;</span></div>
</li>
<li class="li1">
<div class="de1">arg = <span class="br0">&#123;</span><span class="st0">&quot;status&quot;</span>:status<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">istek = ornek2.<span class="me1">RequestWithOAuth</span><span class="br0">&#40;</span><span class="st0">&quot;POST&quot;</span>,statusupdateurl,arg<span class="br0">&#41;</span> <span class="co1">#bu kadar <img src='http://www.brsyuksel.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">print</span> istek <span class="co1">#servisin cevabini, yani verilen ciktiyi yazdiriyoruz.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p><a href='http://www.brsyuksel.com/wp-content/uploads/TwittellOAuth.tar.gz'>TwittellOAuth ve OAuth sınıfı indirmek için tıklayınız.</a></p>
<p>Bitirirken&#8230;<br />
Ben OAuth&#8217;u yeterli seviyede ingilizce bilgisine olmadığımdan dolayı, bir çok örnek kodları inceleyerek öğrendim. Sizler <a href="http://oauth.net">oauth.net</a> adresinden daha düzgün ve daha detaylı bir belge okuyarak kolayca bilgi sahibi olabilirsiniz.<br />
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.<br />
Twittell adlı uygulamayı yayınladıktan sonra, kısmet olursa oauth&#8217;un sunucu tarafında kullanımını inceleyen bir yazı yazmayı planlıyorum, bunun da haberini vermiş olayım <img src='http://www.brsyuksel.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.brsyuksel.com/oauth.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
