<?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>Tender Surrender &#187; OAuth</title>
	<atom:link href="http://devlog.agektmr.com/en/archives/category/oauth/feed" rel="self" type="application/rss+xml" />
	<link>http://devlog.agektmr.com</link>
	<description>SocialWeb Evolves</description>
	<lastBuildDate>Mon, 05 Jul 2010 05:13:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>EN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>GadgeTweetr: The first and ultimate Twitter client on OpenSocial using OAuth</title>
		<link>http://devlog.agektmr.com/en/archives/624</link>
		<comments>http://devlog.agektmr.com/en/archives/624#comments</comments>
		<pubDate>Tue, 18 Aug 2009 07:23:34 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OAuth]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[Gadget]]></category>
		<category><![CDATA[GadgeTweetr]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=624</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F624", "style": "big", "title": "GadgeTweetr: The first and ultimate Twitter client on OpenSocial using OAuth" });

goo Home just launched its Outbound OAuth support from today. Now, any gadget developers on goo Home can easily mash up external contents authorized using OAuth.
For demonstration purpose, I&#8217;ve developed a gadget, which I believe is the world&#8217;s [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F624%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22GadgeTweetr%3A%20The%20first%20and%20ultimate%20Twitter%20client%20on%20OpenSocial%20using%20OAuth%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F624", "style": "big", "title": "GadgeTweetr: The first and ultimate Twitter client on OpenSocial using OAuth" });</script></div>
<p><a href="http://home.goo.ne.jp/gadget/qYpTF5ucNCt2/detail" target="_blank"><img style="border: 0px initial initial;" title="GadgeTweetr_Logo" src="http://devlog.agektmr.com/wp-content/uploads/2009/08/GadgeTweetr_Logo.png" alt="GadgeTweetr_Logo" width="616" height="119" /></a></p>
<p><a href="http://home.goo.ne.jp/" target="_blank">goo Home</a> just launched its <a href="http://developer.home.goo.ne.jp/document/OAuthリクエスト" target="_blank">Outbound OAuth support</a> from today. Now, any gadget developers on goo Home can easily mash up external contents authorized using OAuth.</p>
<p>For demonstration purpose, I&#8217;ve developed a gadget, which I believe is the world&#8217;s first <a href="http://twitter.com/" target="_blank">Twitter</a> client on OpenSocial using OAuth, called &#8220;<a href="http://home.goo.ne.jp/gadget/qYpTF5ucNCt2/detail" target="_blank">GadgeTweetr</a>&#8220;. GadgeTweetr is simple, but powerful, even on comparing to other desktop Twitter clients.</p>
<h2>Major features</h2>
<ul>
<li>OAuth Login</li>
<li>Tabs</li>
<li>Show In-Reply-To</li>
<li>Search</li>
<li>Multi-account</li>
</ul>
<h2 style="font-size: 1.5em;">OAuth Login</h2>
<p>With support of <a href="http://oauth.net/core/1.0" target="_blank">OAuth</a>, GadgeTweetr can let users login to Twitter without giving credentials to goo Home. Just by clicking &#8220;Login&#8221; button, a new window opens with clear indication that the browser is showing page on twitter.com, users can login to Twitter safely without worrying this is phishing.</p>
<p><img style="border: 0px initial initial;" title="login_using_oauth" src="http://devlog.agektmr.com/wp-content/uploads/2009/08/decd90d6f3baa9553fd625ecb11d3b8b-300x203.png" alt="login_using_oauth" width="300" height="203" /></p>
<h2 style="font-size: 1.5em;">Tabs</h2>
<p>Using OpenSocial tabset feature, GadgeTweetr provides view of various status pages like some other Twitter clients do. Timeline, Mentions, Direct Message, Favorites, etc.</p>
<p><img style="border: 0px initial initial;" title="tabs" src="http://devlog.agektmr.com/wp-content/uploads/2009/08/tabs.png" alt="tabs" width="288" height="143" /></p>
<h2 style="font-size: 1.5em;">Show In-Reply-To</h2>
<p>If the status is in-reply-to someone, GadgeTweetr shows &#8220;reply to:&#8221; beside its date. Clicking it will insert source status just blow that, so that you can drill down (up?) to the original tweet.</p>
<p><img style="border: 0px initial initial;" title="replies" src="http://devlog.agektmr.com/wp-content/uploads/2009/08/replies-300x157.png" alt="replies" width="300" height="157" /></p>
<h2 style="font-size: 1.5em;">Search</h2>
<p>You can search on Twitter. GadgeTweetr opens search result tab.</p>
<p><img style="border: 0px initial initial;" title="search" src="http://devlog.agektmr.com/wp-content/uploads/2009/08/search-300x203.png" alt="search" width="300" height="203" /></p>
<h2 style="font-size: 1.5em;">Multi-account</h2>
<p>User can embed multiple copies of GadgeTweetr gadgets on goo Home&#8217;s home page with different authentications. So you have multiple Twitter accounts in one view!</p>
<p><img style="border: 0px initial initial;" title="multi-account" src="http://devlog.agektmr.com/wp-content/uploads/2009/08/multi-account-150x150.png" alt="multi-account" width="150" height="150" /></p>
<h2 style="font-size: 1.5em;">Misc features</h2>
<h3 style="font-size: 1.17em;">3 views</h3>
<p>GadgeTweetr has 3 views: home, profile and canvas. Home view provides Timeline, Mentions tabs, profile view provides its owner&#8217;s timeline, canvas view provides Timeline, Mentions, Direct Message, Favorites tabs as default.</p>
<h3 style="font-size: 1.17em;">Auto link</h3>
<p>GadgeTweetr detects @ and # and hyper link it, as well as external link. External link will open new window. @ and # opens new tab in GadgeTweetr showing respective status.</p>
<h3 style="font-size: 1.17em;">ReTweet</h3>
<p>By clicking ReTweet button, you can tweet copy of your favorite status message with indication of ReTweet: &#8220;RT&#8221;. Of course, you can add your comment just as you do on your own tweet.</p>
<h3 style="font-size: 1.17em;">Show profile</h3>
<p>Clicking thumbnail of a user shows profile dialog with description of the person, numbers of friends, followers, tweets.</p>
<h3 style="font-size: 1.17em;">Follow, unfollow</h3>
<p>On profile dialog, you can even follow or unfollow the user depending on your relationship with the user.</p>
<h2 style="font-size: 1.5em;">Summary</h2>
<p>So, this is the &#8220;GadgeTweetr&#8221;. Sorry but this gadget only works on <a href="http://home.goo.ne.jp/" target="_blank">goo Home</a> for now, since I don&#8217;t know any other containers which supports OAuth properly designed to deploy this kind of gadget.</p>
<p>However, this gadget is already supporting English and is ready to serve to other containers. Although current version is just a plain Twitter client, I&#8217;m planning to implement more SOCIAL functionality as well.</p>
<p>Hope this helps the evolution of social web!</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/624/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Footprint gadget for your FriendConnect</title>
		<link>http://devlog.agektmr.com/en/archives/325</link>
		<comments>http://devlog.agektmr.com/en/archives/325#comments</comments>
		<pubDate>Wed, 07 Jan 2009 16:07:32 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[FriendConnect]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[SocialWeb]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=325</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F325", "style": "big", "title": "Footprint gadget for your FriendConnect" });
I developed FriendIntroducer as an experiment and was trying to understand how FriendConnect is different from ordinaly OpenSocial implementation. So this time, I&#8217;ve tried to develop a gadget which you can find FriendConnect interesting, Footprints. You know the idea if you&#8217;ve tried MyBlogLog before.
What [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F325%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Footprint%20gadget%20for%20your%20FriendConnect%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F325", "style": "big", "title": "Footprint gadget for your FriendConnect" });</script></div>
<p>I developed <a href="http://devlog.agektmr.com/archives/310">FriendIntroducer</a> as an experiment and was trying to understand how FriendConnect is different from ordinaly OpenSocial implementation. So this time, I&#8217;ve tried to develop a gadget which you can find FriendConnect interesting, Footprints. You know the idea if you&#8217;ve tried MyBlogLog before.</p>
<h2>What is Footprints?</h2>
<p>Footprints is a gadget to track visitor of you blog. Look at the gadget on bottom left of this blog.&nbsp;If you&#8217;re not joined or signed in, do it to check what it does.</p>
<p>Footprint is a pretty popular idea on japanese social networks. Once upon a time, SNS were all closed and it was difficult to find people you may know. Footprint functionality was a good tool at that time to find who&#8217;s interested in you.</p>
<p><img width="223" height="211" class="alignnone size-full wp-image-326" title="Footprints1" src="http://devlog.agektmr.com/wp-content/uploads/2009/01/e38394e382afe38381e383a3-5.png" alt="Footprints1" /></p>
<p>As you could imagine, this gadget records visitor and its time. When viewed by others, timestamp will be displayed how long ago, you&#8217;ve visited. Also, you can remove your own footprint if you want.  The xml is located at:</p>
<p><a href="http://devlab.agektmr.com/OpenSocial/FriendConnect/Footprints.xml" target="_blank">http://devlab.agektmr.com/OpenSocial/FriendConnect/Footprints.xml</a></p>
<p>Feel free to take it and use it on your blog.</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/325/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>OAuthの署名方式を掘り下げる</title>
		<link>http://devlog.agektmr.com/en/archives/174</link>
		<comments>http://devlog.agektmr.com/en/archives/174#comments</comments>
		<pubDate>Fri, 03 Oct 2008 19:11:18 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OAuth]]></category>
		<category><![CDATA[HMAC-SHA1]]></category>
		<category><![CDATA[iGoogle]]></category>
		<category><![CDATA[MySpace]]></category>
		<category><![CDATA[Orkut]]></category>
		<category><![CDATA[RSA-SHA1]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=174</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F174", "style": "big", "title": [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F174%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OAuth%E3%81%AE%E7%BD%B2%E5%90%8D%E6%96%B9%E5%BC%8F%E3%82%92%E6%8E%98%E3%82%8A%E4%B8%8B%E3%81%92%E3%82%8B%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F174", "style": "big", "title": "OAuthの署名方式を掘り下げる" });</script></div>
<p>当ブログでこれまで何度かOpenSocialに絡んだOAuthについて取り上げてきましたが、MySpaceを参考にしていたため、署名方式としてHMAC-SHA1のみを対象にしてきました。しかしShindigを掘り下げる上でRSA-SHA1を避けて通ることはできず、むしろこちらについても十分な知識を得ていないとなかなか先に進めないことが分かりましたので、この機会にまとめてみます。(OpenSocialをある程度前提にしていますが、署名の話はOpenSocialに限らないものです。)</p>
<h2>署名とは何か</h2>
<p>ITの世界で署名とは、問い合わせ元がその人であることを証明するための手段、と言えます。OAuthだと、コンシューマがサービスプロバイダに対して、名乗っている通りの者であることを証明することを意味します。これは、「自分」もしくは「相手と自分」にしか分からないものをリクエストに付け加えて送ることで実現されます。</p>
<p><a href="http://oauth.net/core/1.0" target="_blank">OAuthの仕様</a>では、署名方式について厳密に規定していませんが、HMAC-SHA1、RSA-SHA1、PLAINTEXTの3つの署名方式を説明しています。</p>
<blockquote><p>OAuth does not mandate a particular signature method, as each implementation can have its own unique requirements. The protocol defines three signature methods: <tt>HMAC-SHA1</tt>, <tt>RSA-SHA1</tt>, and <tt>PLAINTEXT</tt>, but Service Providers are free to implement and document their own methods. Recommending any particular method is beyond the scope of this specification.</p></blockquote>
<h2>HMAC-SHA1</h2>
<p>HMAC-SHA1を使ったOAuthでは、予めコンシューマとサービスプロバイダが、同じコンシューマキー(oauth_consumer_key)とコンシューマシークレット(oauth_consumer_secret)を持ちます。コンシューマシークレットはもちろん、秘密というくらいですから、2者以外に知られてはいけません。2者がコンシューマシークレットを共有することから、Shared Secretと呼んだりもします。</p>
<p>MySpaceでは、コンシューマキーをアプリケーションのURL、コンシューマシークレットをMD5らしきランダムな(?)ハッシュ文字列としていますが、コンシューマキーはディベロッパの任意で変更可能です。詳しくは<a href="http://devlog.agektmr.com/archives/tag/oauth">この辺り</a>をご覧下さい。</p>
<h2>RSA-SHA1</h2>
<p>逆に、RSA-SHA1の方式では、コンシューマが公開鍵と秘密鍵を持ちますが、サービスプロバイダは秘密鍵を知ることはありません。コンシューマは秘密鍵で暗号化した署名を加えたリクエストを投げます。この暗号化された署名は、公開鍵でしか解くことができませんし、秘密鍵でしか作ることができないため、コンシューマが身分を証明できる、という訳です。</p>
<p>署名を作る際、HMAC-SHA1方式の場合、コンシューマシークレット(oauth_consumer_secret)とトークンシークレット(oauth_token_secret)を&#8221;&amp;&#8221;で繋いだものをkeyとして利用しますが、RSA-SHA1方式の場合、秘密鍵をkeyとして使って暗号化します。そのため、コンシューマシークレットとトークンシークレットは不要です。</p>
<p>逆にサービスプロバイダは、公開鍵を使って署名が正当なものであることを確認します。</p>
<pre class="brush: php;">
$publickeyid = openssl_get_publickey($cert);
$ok = openssl_verify($raw, $signature, $publickeyid);
openssl_free_key($publickeyid);
</pre>
<p>$certは公開鍵、$rawは署名の基本文字列(Signature Base String)、$signatureは署名文字列(oauth_signature)を表しています。$rawと$signatureはコンシューマからのリクエストで生成することができますが、$certについてはちょっと考察が必要です。</p>
<h2>RSA-SHA1の公開鍵の扱い</h2>
<p>OAuthの拡張として<a href="http://dirk.balfanz.googlepages.com/oauth_key_rotation.html" target="_blank">OAuth Key Rotation Extension</a>が提案されています。これはコンシューマがサービスプロバイダにリクエストする際、公開鍵のIDをリクエストと一緒に渡すことで、サービスプロバイダに鍵をダウンロード/認識させるための仕様です。公開鍵のIDはxoauth_signature_publickeyパラメータで渡されます</p>
<p>※<a href="http://dirk.balfanz.googlepages.com/oauth_key_rotation.html" target="_blank">OAuth Key Rotation Extension</a>のドラフト、<a href="http://www.opensocial.org/Technical-Resources/opensocial-spec-v08/gadgets-reference08#gadgets.io.makeRequest" target="_blank">OpenSocial/Gadgetの仕様書</a>など、いくつかのドキュメントにxoauth_public_keyと記述されていますが、Shindigの実装でxoauth_signature_publickeyが使用されており、こちらが正式なものとなるようです。</p>
<p>ここで公開鍵のIDと言いましたが、もちろん、これだけでは公開鍵を取得することができないので、これを使ってゴニョゴニョする必要があります。</p>
<p>が、、、。</p>
<p><a href="http://www.opensocial.org/Technical-Resources/opensocial-spec-v08/gadgets-reference08#gadgets.io.makeRequest" target="_blank">OpenSocial/Gadgetの仕様書</a>には</p>
<blockquote><p>The container should make its public key available for download at a well-known location. The location <code>https://<em>container-hostname</em>/opensocial/certificates/<em>xoauth_public_keyvalue</em></code> is recommended.</p></blockquote>
<p>と書いてあるのですが、Shindigの実装ではhttp://container-hostname/public.cerになっていたりと、仕様が一貫していません。</p>
<p>現実はどうしているかというと、xoauth_signature_publickeyを無視して、コンテナのドキュメントに書いてある公開鍵をコピペして<strong>ソースコードにハードコーディング</strong>しています。hi5、Orkutについては動作確認ができました。iGoogleについては<a href="https://sites.google.com/site/oauthgoog/oauth-proxy" target="_blank">ここ</a>に公開鍵が書いてありますが、動作しませんでした。</p>
<p>OAuthが広まって様々なコンシューマが登場するまでは、まだまだこの中途半端な状態が続くのではないでしょうか。</p>
<h2>コンシューマは誰か</h2>
<p>ここで勘のいい方は気付かれたと思いますが、RSA-SHA1方式の場合、署名元が<strong>OpenSocialのコンテナサイトそのもの</strong>になっています。MySpaceのように、<strong>ガジェットではありません</strong>。ということは、もちろんコンシューマキー(oauth_consumer_key)もOrkutなら&#8221;orkut.com&#8221;、hi5なら&#8221;hi5.com&#8221;といった具合に、コンテナサイトを表すものが使用されます。</p>
<p>またこの方式の場合、どのガジェットがリクエストを投げているのかを表すため、<strong>xoauth_app_urlというパラメータ</strong>が追加されます。これを提案しているのが<a href="http://dirk.balfanz.googlepages.com/oauth_gadget_extension.html" target="_blank">OAuth Gadget Extension</a>です。</p>
<p>MySpaceのようにHMAC-SHA1を使っている場合は、ガジェットごとにコンシューマキーを設定し、ガジェットのリクエストをコンテナがProxyするという形を取っていました。これはShindigを使っているiGoogle、Orkut、hi5と、独自にOpenSocialを実装しているMySpaceとの方針の違いから来るものです。</p>
<p>HMAC-SHA1方式でコンテナをコンシューマとして扱おうとすると、シークレットは2者間のみで共有されなければならないため、コンシューマは、サービスプロバイダごとにキーとシークレットを発行しなければなりません。しかし、RSA-SHA1方式であれば、コンテナがコンシューマでも、公開鍵と秘密鍵の組み合わせは一つだけあれば使い回せるため、OpenSocialにおけるmakeRequest (Outbound OAuth)のように、コンテナが外部サービスからデータを取得するアーキテクチャの場合、RSA-SHA1方式にした方がコンシューマにとってサービスプロバイダの追加も容易になりますし、サービスプロバイダにとってコンシューマの署名を確認する作業も楽になるのが利点です。</p>
<p>ShindigがRSA-SHA1方式を中心に実装されているのはそんな理由がありそうです。ちなみに、Shindigの開発はGoogleが中心になって行われており、HMAC-SHA1方式についても現在実装中らしいですが、iGoogleでのコンシューマキーとコンシューマシークレットの発行は、メールで依頼することになっているため、今のところ本気で考えてはいなさそうです。</p>
<blockquote><p>In the case of the iGoogle sandbox, you can send mail to oauthproxyreg@google.com with the following information to register your shared secret:<br />
* URL of your gadget<br />
* The shared secret assigned to you by the service provider<br />
* The consumer key assigned to you by the service provider<br />
* Whether to use symmetric or asymmetric signing with the service provider (or say that you don&#8217;t know)<br />
Until your shared secret has been registered, your gadget will not work.  If you change the URL of your gadget, you will need to re-register the secret for that gadget.</p></blockquote>
<h2>まとめ</h2>
<p>現時点ではOpenSocialのOutbound OAuthではMySpaceがHMAC-SHA1方式でガジェットをコンシューマに、Shindig系コンテナはRSA-SHA1方式でコンテナをコンシューマにしていますので、外部サーバーとやり取りを多なうOpenSocialガジェットを作る場合、どちらからのリクエストも受け付けられるよう構築しておく必要がありそうです。</p>
<h2><strong>参考サイト</strong></h2>
<ul>
<li><a href="http://d.hatena.ne.jp/lyokato/20080818/1219081040" target="_blank">Outbound OAuthを実現するOAuth Proxy &#8211; Codin&#8217; In The Free World</a></li>
<li><a href="https://sites.google.com/site/oauthgoog/oauth-proxy" target="_blank">OAuth Proxy(Google OAuth &amp; Federated Login Research)</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/174/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Data AvailabilityでOAuthを試す</title>
		<link>http://devlog.agektmr.com/en/archives/107</link>
		<comments>http://devlog.agektmr.com/en/archives/107#comments</comments>
		<pubDate>Tue, 05 Aug 2008 16:27:19 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Data Availability]]></category>
		<category><![CDATA[MySpace]]></category>
		<category><![CDATA[OpenSocial]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=107</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F107", "style": "big", "title": [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F107%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Data%20Availability%E3%81%A7OAuth%E3%82%92%E8%A9%A6%E3%81%99%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F107", "style": "big", "title": "Data AvailabilityでOAuthを試す" });</script></div>
<p><a href="http://devlog.agektmr.com/archives/79"></a>前エントリでの予告通り、実際にサーバーサイドでコードを書き、MySpaceのData Availabilityを使ってOAuthを試してみます。<a href="http://developer.myspace.com/community/myspace/dataavailability.aspx" target="_blank">Data Availability</a>という名前は大げさに聞こえるかもしれませんが、実際はOpenSocial RESTful APIです。ちなみにData AvailabilityではまだJSON形式のみのサポートで、AtomPubには対応していません(しかも404が返ってくる。これに相当ハマった○|￣|＿)。</p>
<p>今回はOAuthを使って認証・認可を取得し、Data Availability APIを叩くところまでを解説します。</p>
<h2>下準備</h2>
<p>まずはサンドボックス環境にMySpaceにアプリを作ってください。細かい手順が分からない方は<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20080708/310341/" target="_blank">この辺</a>を参考にしてください。</p>
<p>MySpaceではガジェットアプリも外部アプリも同じように扱われるようです。</p>
<p><img class="alignnone size-full wp-image-108" title="MySpaceApps" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-11.jpg" alt="" width="500" height="98" /></p>
<p>Edit Detailsを開くと、アプリケーションの詳細設定を編集することができます。</p>
<p>ここで<a href="http://devlog.agektmr.com/archives/79" target="_blank">OAuthの利用に必要なもの</a>を思い出してください。まずはコンシューマキー(consumer_key)とコンシューマシークレット(consumer_secret)です。</p>
<p><span style="text-decoration: underline;"><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-31.jpg"><img class="alignnone size-full wp-image-110" title="MySpaceAppConsumer" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-31.jpg" alt="" width="500" height="126" /></a></span></p>
<p>MySpaceの場合、アプリケーションを登録した段階でこれら2つが発行されます。コンシューマキーについては好きなものに変更できますが、ここではアプリケーションのガジェットXMLぽいURLにしてみました。後で必要になりますので、どこかにコピペっておきましょう。</p>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-4.jpg"><img class="alignnone size-full wp-image-111" title="MySpaceAppDomain" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-4.jpg" alt="" width="500" height="309" /></a></p>
<p>次に、同じページの下の方にExternal Site Settingsという項目があります。これがData Availabilityの肝です。</p>
<ul>
<li>Use External Domainにチェックを入れる</li>
<li>External URLにMySpaceからの誘導先URLを入力</li>
<li>External Domainに実際に外部アプリを置くサーバーのドメインを入力</li>
<li>利用規約を読んで同意</li>
</ul>
<p>これで準備オッケー。</p>
<h2>OAuthを実装する</h2>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-3.jpg"><img class="alignnone size-full wp-image-101" title="Inbound OAuth" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-3.jpg" alt="" width="500" height="148" /></a></p>
<p>今回試すのは上図の外部サービス、つまりコンシューマに当たる部分です。サービスプロバイダに当たるのはMySpace。ゼロから実装してもよいのですが、せっかく<a href="http://code.google.com/p/oauth/" target="_blank">便利なライブラリ</a>がありますので、これのPHP版を使って試してみます。また、署名方式はHMAC-SHA1を使います。</p>
<p>OAuthのフローは下記の通り。<a href="http://www.atmarkit.co.jp/fsecurity/special/106oauth/oauth01.html" target="_blank">この辺り</a>を読んで仕様を理解しておく事をお勧めします。</p>
<ol>
<li>リクエストトークンを取得</li>
<li>ユーザー認証</li>
<li>アクセストークンを取得</li>
<li>リソースにアクセス</li>
</ol>
<h3><strong>リクエストトークンを取得</strong></h3>
<p>必要なライブラリをインクルードします。</p>
<pre class="brush: php;">require_once 'oauth/OAuth.php';
require_once 'oauth/OAuth_TestServer.php';</pre>
<p>各種変数をセットしておきましょう。先程メモった<strong>consumer_key</strong>と<strong>consumer_secret</strong>はここで使います。<strong>リクエストトークン</strong>を取得するためのエンドポイントは<a href="http://developer.myspace.com/community/myspace/dataavailability.aspx" target="_blank">MySpaceのドキュメント</a>に記載されています。</p>
<pre class="brush: php;">$consumer['key'] = 'http://devlab.agektmr.com/MyOpenSpace/DataAvailabilityExample';
$consumer['secret'] = '************';
$endpoint = 'http://api.myspace.com/request_token';</pre>
<p>署名のロジックはめんどくさいのでライブラリにお任せ。</p>
<pre class="brush: php;">$server = new TestOAuthServer(new MockOAuthDataStore());
$server-&gt;add_signature_method(new OAuthSignatureMethod_HMAC_SHA1());

$sig_methods = $server-&gt;get_signature_methods();
$sig_method = $sig_methods['HMAC-SHA1'];

$consumer = new OAuthConsumer($consumer['key'], $consumer['secret'], NULL);
$request = OAuthRequest::from_consumer_and_token($consumer, NULL, &quot;GET&quot;, $endpoint, null);
$request-&gt;sign_request($sig_method, $consumer, NULL);

$req = curl_init($request);
curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($req);</pre>
<p>ここまでのコードで$resultにリクエストトークンが返ってくることになります。URLのquery部と同じ形式で返ってきますので、必要に応じてパースしましょう。</p>
<pre class="brush: php;">parse_str($result, $tmp);</pre>
<p>これで、<strong>oauth_token</strong>と<strong>oauth_token_secret</strong>が取得できたはずです。</p>
<h3>認証</h3>
<p>次にユーザーに認証を行ってもらいます。エンドポイントはhttp://api.myspace.com/authorizeで行います。その際、先程取得した<strong>oauth_token</strong>と<strong>oauth_callback</strong>をパラメータとして付属します。oauth_callbackは認証後に呼び出されるページのURL。</p>
<pre class="brush: php;">$callback_url = 'http://devlab.agektmr.com/MyOpenSpace/access.php';
$auth_url = 'http://api.myspace.com/authorize?oauth_token='.urlencode($tokens['oauth_token']).
    '&amp;oauth_callback='.urlencode($callback_url);</pre>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-2.jpg"></a><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-5.jpg"><img class="alignnone size-medium wp-image-115" title="MySpaceAppAuth" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-5-300x288.jpg" alt="" width="300" height="288" /></a></p>
<h3>アクセストークンを取得</h3>
<p>先程指定したoauth_callbackのURLに<strong>oauth_token</strong>をパラメータとして付属してリダイレクトされてきます。これはこのoauth_tokenが認証済みであることを示しており、<strong>アクセストークン</strong>への交換が可能となります。</p>
<pre class="brush: php;">$consumer = new OAuthConsumer($consumer['key'], $consumer['secret'], NULL);
$tokener  = new OAuthConsumer($tokens['oauth_token'], $tokens['oauth_token_secret']);
$access = OAuthRequest::from_consumer_and_token($consumer, $tokener, &quot;GET&quot;, $endpoint, null);
$access-&gt;sign_request($sig_method, $consumer, $tokener);

$req = curl_init($access);
curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($req);</pre>
<p>コードはリクエストトークン取得の際とあまり変わりありません。これでアクセストークンの<strong>oauth_token</strong>と<strong>oauth_token_secret</strong>が返っきたら準備オッケー。</p>
<h3>RESTful APIを叩く</h3>
<p>ここまでに取得した<strong>consumer_key</strong>、<strong>consumer_secret</strong>、<strong>oauth_token</strong>、<strong>oauth_token_secret</strong>を使って署名したOAuthリクエストをRESTful APIに投げることにより、友達リストなどのデータ取得が可能になります。</p>
<pre class="brush: php;">$consumer = new OAuthConsumer($consumer['key'], $consumer['secret'], NULL);
$tokener  = new OAuthConsumer($tokens['oauth_token'], $tokens['oauth_token_secret']);
$resource = OAuthRequest::from_consumer_and_token($consumer, $tokener, &quot;GET&quot;, $endpoint, array('format'=&gt;'JSON'));
$resource-&gt;sign_request($sig_method, $consumer, $tokener);

$req = curl_init($resource);
curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($req);</pre>
<p>これでエンドポイント($endpoint)を取得したいリソースのURLにすればOK。レスポンスボディにJSON形式でデータが返ってきます。</p>
<h2>サンプルアプリ</h2>
<p>上記コードを使って一連の流れを見ながら動作を確認できるサンプルを用意しました。どういうリクエストを投げるのか参考になると思います。</p>
<p style="text-align: center;"><a href="http://devlab.agektmr.com/DataAvailability/" target="_blank">実際に動作するサンプルはコチラ</a></p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/107/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSocialのOAuthまとめ</title>
		<link>http://devlog.agektmr.com/en/archives/79</link>
		<comments>http://devlog.agektmr.com/en/archives/79#comments</comments>
		<pubDate>Fri, 01 Aug 2008 15:50:46 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OAuth]]></category>
		<category><![CDATA[OpenSocial]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=79</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F79", "style": "big", "title":  [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F79%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenSocial%E3%81%AEOAuth%E3%81%BE%E3%81%A8%E3%82%81%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F79", "style": "big", "title": "OpenSocialのOAuthまとめ" });</script></div>
<p>OpenSocialでは、コンテナが外部サーバーとの通信を行う際、または外部サーバーがコンテナと通信を行う際、OAuthを使用して認可を行います。今回はOpenSocialにおけるOAuthについて、現段階でのまとめを書いてみます。  ※追記(2008/10/20)：2008/10/4に書いた<a href="http://devlog.agektmr.com/archives/174">コチラ</a>の記事も必読です。</p>
<h2>OAuthって何だったっけ？</h2>
<p>OAuthは<strong>ユーザー</strong>、<strong>コンシューマ</strong>、<strong>サービスプロバイダ</strong>の3者間でデータのやり取りを行うとした場合、ユーザーがコンシューマにクレデンシャル(IDやパスワード)を渡すことなく、ユーザーが所有するサービスプロバイダ上の<strong>リソース</strong>にコンシューマをアクセスさせるためのものです。  例えば<strong>ユーザー</strong>が<strong>Google(サービスプロバイダ)</strong>の<strong>アドレス帳(リソース)</strong>を<strong>MySpace(コンシューマ)</strong>上で利用するシーンを思い浮かべてください。OAuthがなければ、MySpaceにGoogleのIDとパスワードを預けなければならなかったものが、OAuthを使うことで、ユーザーが直接Googleと認証のやりとりを行い、MySpaceにGoogleのID/パスワードを渡すことなく、アドレス帳のデータをMySpaceに渡すことができるようになります。</p>
<h2>2種類のOAuth</h2>
<p>さて、そんな便利なOAuthですが、OpenSocialで利用されるものには2種類あります。</p>
<h3>OAuth Core</h3>
<p><a href="http://oauth.net/core/1.0/" target="_blank">OAuth Core</a>では、先程説明したように、<strong>ユーザー</strong>、<strong>コンシューマ</strong>、<strong>サービスプロバイダ</strong>の3者間でやり取りを行います。ベーシックなものですので、詳細については<a href="http://www.atmarkit.co.jp/fsecurity/special/106oauth/oauth01.html" target="_blank">この辺</a>りを参考にしてください。</p>
<h3>OAuth Consumer Request</h3>
<p>一方<a href="http://oauth.googlecode.com/svn/spec/ext/consumer_request/1.0/drafts/1/spec.html" target="_blank">OAuth Consumer Request</a>は、OAuthの仕様からユーザー認証部分を除き、コンシューマとサービスプロバイダのやり取りにフォーカスした仕様で、一般に&#8221;<strong>two-legged OAuth</strong>&#8220;と呼ばれます。これはコンシューマとサービスプロバイダの信頼関係だけで、ユーザーによる認証を伴わない仕様のため、<span style="text-decoration: line-through;">コンシューマがサービスプロバイダからパブリックな情報を取得したい場合に利用するケースが想定されます。</span> (かなり恥ずかしい間違いです。正確には<strong>コンシューマが署名を付加することで、サービスプロバイダがリクエスト元とリクエスト内容に間違いがないことを確認できる仕様</strong>、です。/ 2009年10月追記)ちなみにOpenSocial v0.7ではOAuth Coreの利用は仕様に含まれておらず、このtwo-legged OAuthを利用することになっています。OAuth Coreが利用できるのはOpenSocial v0.8以降での話になります(もちろん、two-legged OAuthも利用できます)。</p>
<h2>OpenSocialにおけるOAuth利用パターン</h2>
<p>OpenSocialでOAuthを利用する形態として、さらに2通りが考えられます。</p>
<h3>ガジェットが外部サーバーとやり取りを行うOutbound OAuth</h3>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-1.jpg"><img class="alignnone size-medium wp-image-100" title="Outbound OAuth" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-1-300x95.jpg" alt="" width="300" height="95" /></a> ここでは仮に<strong>Outbound OAuth</strong>と呼びます。type=&#8221;html&#8221;で作られたガジェットが、SNSコンテナをプロキシとしてコンシューマの役割を果たし、サービスプロバイダとなる外部サーバーとmakeRequestで通信を行うケースです。</p>
<h3>外部サーバーがコンテナとやり取りを行うInbound OAuth</h3>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-3.jpg"><img class="alignnone size-medium wp-image-101" title="Inbound OAuth" src="http://devlog.agektmr.com/wp-content/uploads/2008/08/e38394e382afe38381e383a3-3-300x88.jpg" alt="" width="300" height="88" /></a> ここでは仮に<strong>Inbound OAuth</strong>と呼びます。コンシューマとなる外部サーバーがサービスプロバイダであるSNSコンテナのRESTful APIを叩くケースです。type=&#8221;url&#8221;のガジェットが外部サーバーを通してSNSコンテナのRESTful APIを叩くケースもこれに該当します。</p>
<h2>OAuthの利用に必要なもの</h2>
<p>OAuthの利用には前提条件がいくつか存在します。細かい仕様は別途調べていただくとして、事前に必要な条件が下記になります。</p>
<ul>
<li>コンシューマが、サービスプロバイダの発行する以下を事前に知っていること。
<ul>
<li>コンシューマキー(consumer_key)</li>
<li>コンシューマシークレット(consumer_secret)</li>
</ul>
</li>
<li>コンシューマが、サービスプロバイダとOAuthのやり取りを行う以下3つのURLを知っていること
<ul>
<li>サービスプロバイダのリクエストトークンURL</li>
<li>サービスプロバイダのアクセストークンURL</li>
<li>サービスプロバイダの認証URL</li>
</ul>
</li>
</ul>
<p>※追記(2008/10/20)：コンシューマシークレットについては、署名方式がRSA-SHA1の場合、必須ではありません。詳しくは<a href="http://devlog.agektmr.com/archives/174">コチラ</a>。  OAuth利用パターンごとにどのようにしてこの条件をクリアするかを検証してみます。</p>
<h3>Outbound OAuthのケース</h3>
<p>ガジェットが外部サーバーとやり取りを行うケースですので、まずはガジェット開発者がSNSコンテナにコンシューマキーとコンシューマシークレットを登録します。ですが僕の知る限り、まだ<strong>Outbound OAuthを実装しているSNSはありません</strong>。なので、ここでは何かしらの手段を用いて(SSLページでFormを使って投稿等)、コンシューマキーとコンシューマシークレットをコンテナに渡したものと想定してください。(今後順次、これを実現する方法は登場するものと思われます。)  次に、サービスプロバイダの各種URLを渡す必要がありますが、v0.8ではガジェットXMLで渡すよう規定されています。OAuthをModulePrefsの中に作成してください。</p>
<pre class="brush: xml;">
&lt;oauth&gt;
&lt;service name="google"&gt;
&lt;request url="https://www.google.com/accounts/OAuthGetRequestToken?scope=http://www.google.com/m8/feeds/" /&gt;
&lt;access url="https://www.google.com/accounts/OAuthGetAccessToken" /&gt;
&lt;authorization url="https://www.google.com/accounts/OAuthAuthorizeToken" /&gt;
&lt;/service&gt;
&lt;/oauth&gt;
</pre>
<p>OAuthは必ずしも1つのサーバーとやり取りするとは限りませんので、Serviceを追加することで複数をサポートすることができるようになっています。Service@nameで使い分けることが出来るようになっていますので、必要に応じてmakeRequestのopt_paramsに下記のパラメータを加え、サービスを指定してください。</p>
<pre>gadgets.io.RequestParameters.OAUTH_SERVICE_NAME</pre>
<p>サービスプロバイダとOAuthのやり取りを行うURLについては、XRDS-Simpleによって解決する方法もありますが、こちらについては別の機会にまとめてご紹介します。</p>
<h3>Inbound OAuthのケース</h3>
<p>外部アプリケーションがSNSコンテナのRESTful APIにアクセスする場合になります。これはまさに、FacebookのFacebook ConnectやMySpaceのData Availability、GoogleのFriendConnectに該当するもので、まだ実験的な段階にあると言えるものです。  コンシューマキーとコンシューマシークレットですが、SNSコンテナ上でアプリケーションを登録することで発行されます。それをディベロッパがメモ/コピペしてコンシューマとなるサーバーのコードに埋め込みましょう。URLについては、単純にヘルプページを見る方法と、XRDS-Simpleによるオートディスカバリを行う方法が考えられます。</p>
<h2>まとめ</h2>
<p>今回は大まかな話を書きましたが、次回は実際にMySpaceのData Availabilityを使ってOAuth認証を行い、データを取得するところまでを試してみたいと思います。</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/79/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySpaceのRESTful APIでOAuth認証を試してみる</title>
		<link>http://devlog.agektmr.com/en/archives/42</link>
		<comments>http://devlog.agektmr.com/en/archives/42#comments</comments>
		<pubDate>Fri, 18 Apr 2008 17:48:06 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OAuth]]></category>
		<category><![CDATA[MySpace]]></category>
		<category><![CDATA[RESTful API]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=42</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F42", "style": "big", "title":  [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_light-green" style="float: left;margin-right: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fdevlog.agektmr.com%252Fen%252Farchives%252F42%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22MySpace%E3%81%AERESTful%20API%E3%81%A7OAuth%E8%AA%8D%E8%A8%BC%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F42", "style": "big", "title": "MySpaceのRESTful APIでOAuth認証を試してみる" });</script></div>
<p>MySpaceで公開されているMDP(MySpace Developer Platform)には、OpenSocialだけでなく独自のRESTful APIも含まれており、これを使うことでサーバーサイドにアプリケーションを作ることもできるようになっています。今回は、MDPのRESTful APIのOAuth認証にフォーカスを当ててみます。</p>
<h2>OpenSocial/MDPのOAuthについて</h2>
<p>OAuthとは、ユーザーとユーザーが利用したいサービス(以後サービスプロバイダ)を仲介するOpenSocial等のコンテナ(以後コンシューマ)が、サービスプロバイダの認証情報を知ることなくAPIを操ることを可能にする、認可のためのプロトコルです。</p>
<p>例えばユーザーがコンシューマ上でサービスプロバイダのアプリを利用しようとすると、サービスプロバイダのドメイン上にある認証画面にリダイレクトされ、ユーザーが許可をし、そこではじめて、コンシューマがサービスプロバイダのAPIを利用可能になる、という使い方が想定されています。</p>
<p>しかし、現在のところOpenSocialで規定されているOAuthはフルスペックではありません。ユーザーがサービスプロバイダの認証画面にリダイレクトされたり、コンシューマとサービスプロバイダがトークンを交換したりといった仕様は想定されていないのです。</p>
<p>これはOpenSocialガジェットがJavaScriptで動作しているためトークンを管理できない、等の理由があるようですが、MySpace独自のRESTful APIでも条件は同じようで、コンシューマキーとコンシューマシークレットがあれば、トークンなしでOAuth認証を行うことができます。</p>
<p>※OAuthの詳しい仕様に関しては<a href="http://www.atmarkit.co.jp/fsecurity/special/106oauth/oauth01.html" target="_blank">この辺り</a>を参考にしてください。</p>
<h2>アプリケーションプロフィールを作る</h2>
<p>まずはMySpaceでアプリケーションを作る準備をします。</p>
<p>MySpaceでアプリケーションを作るためには、ユーザーアカウントとアプリケーションのプロフィールアカウントが必要です。下記のサイトにスクリーンショット付きで解説がありますので、参考にしてください。</p>
<p><a href="http://d.hatena.ne.jp/yorihito_tanaka/20080408" target="_blank">MySpaceアプリケーションを作ろう &#8211; ラーニング人生。</a></p>
<h2>OAuth認証の準備</h2>
<p>アプリケーションプロフィールが作れたら、XMLやJavaScriptのコードは不要です。今回の目的はRESTful APIの認証を試すところにありますので、画面左の<a href="http://developer.myspace.com/modules/apps/pages/myapps.aspx" target="_blank">My Apps</a>をクリックし、作成したアプリケーションプロフィールのEdit Detailsをクリックしてください。</p>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/04/myspace_myapps.jpg"><img class="alignnone size-medium wp-image-43" title="myspace_myapps" src="http://devlog.agektmr.com/wp-content/uploads/2008/04/myspace_myapps-300x160.jpg" alt="" width="300" height="160" /></a></p>
<p>画面下部にOAuth Consumer KeyとOAuth Consumer Secretという部分があります。RESTful APIにアクセスするには、これらが必要になりますので、メモ帳などにコピペしておいてください。OAuth Consumer Keyは任意に変更できますので、変更してもよいかもしれません(保存は忘れずに)。 </p>
<p><span style="color: #0000ee; text-decoration: underline;"><a href="http://devlog.agektmr.com/wp-content/uploads/2008/04/myspace_myapp_detail.jpg"></a><a href="http://devlog.agektmr.com/wp-content/uploads/2008/04/myspace_myapp_detail.jpg"><img class="alignnone size-full wp-image-44" title="myspace_myapp_detail" src="http://devlog.agektmr.com/wp-content/uploads/2008/04/myspace_myapp_detail.jpg" alt="" width="499" height="49" /></a></span></p>
<h2>OAuth Toolで認証してみる</h2>
<p>OAuthではコンシューマキーとNonce、Timestampなどから署名(Signature)を作って認証を行います。署名の作り方は複雑なので、今回はMDPで提供されている<a href="http://developer.myspace.com/modules/apis/pages/oauthtool.aspx" target="_blank">OAuth Tool</a>を使って試してみます。</p>
<p><a href="http://devlog.agektmr.com/wp-content/uploads/2008/04/myspace_oauthtool.jpg"><img class="alignnone size-medium wp-image-45" title="myspace_oauthtool" src="http://devlog.agektmr.com/wp-content/uploads/2008/04/myspace_oauthtool-300x209.jpg" alt="" width="300" height="209" /></a></p>
<p>画面右にある項目を埋めていきます。</p>
<ul>
<li><strong>Server:</strong> サーバーURL。RFC3986で言うschemeとauthorityに当たります。ここではhttp://api.myspace.comとします。</li>
<li><strong>ResourceURL:</strong> サーバーURL以降のパス。RFC3986で言うpathに当たります。queryとfragmentは含みません。ここは/users/{user_id}/friendsとして、user_idにはあなたのユーザーIDを入力してください。他の利用可能なエンドポイントは<a href="http://developer.myspace.com/community/RestfulAPIs/resources.aspx" target="_blank">ここ</a>に記載されています。</li>
<li><strong>Request Method:</strong> HTTPメソッド。GETとします。</li>
<li><strong>Consumer Key:</strong> OAuthのコンシューマキー。先程メモったConsumer Keyを入力してください。</li>
<li><strong>Consumer Secret:</strong> OAuthのコンシューマシークレット。先程メモったConsumer Keyを入力してください。</li>
<li><strong>OAuth Token:</strong> トークン。正式なOAuthではサービスプロバイダに許可を受けてアクセストークンと交換し、初めて認可されます。今回は空の状態にしてください。</li>
<li><strong>OAuth Token Secret:</strong> トークンシークレット。正式なOAuthでトークンの交換に必要になります。今回は空の状態にしてください。</li>
<li><strong><span style="font-weight: normal;"><strong>OAuth TimeStamp:</strong> TimeStamp。UNIXタイムで現在時刻を入力します。今回は空の状態にしてください。</span></strong></li>
<li><strong><span style="font-weight: normal;"><strong>OAuth Nonce:</strong> Nonce。何でもよいですが、毎回必ず違う値を送る必要があります。今回は空の状態にしてください。</span></strong></li>
<li><strong>Signature Method:</strong> 署名方式。HMAC-SHA1を選択。</li>
<li><strong>Version:</strong> OAuthのバージョン。1.0とします。</li>
<li><strong>OAuth Mode:</strong> OAuthモード。Authorization Headerとしてください。</li>
<li><strong>Query options:</strong> OAuth Toolの使い方。Generate URI and Submitとしてください。</li>
</ul>
<p><img class="alignnone size-full wp-image-46" title="myspace_oauthtool_detail" src="http://devlog.agektmr.com/wp-content/uploads/2008/04/myspace_oauthtool_detail.jpg" alt="" width="203" height="424" /></p>
<p>これでOK。executeをクリックします。</p>
<p>Response Bodyにどんな表示が返ってきたでしょうか。自分の友達リストが返ってきていれば成功です。Resource URLの最後に&#8221;.json&#8221;を付け加えると、結果をJSON形式にすることもできます。</p>
<h2>まとめ</h2>
<p>実はこのやり方のOAuthは、外部サーバーからコンテナであるMySpaceに対してリクエストを投げる場合だけでなく、OpenSocialのmakeRequestで、コンテナのプロキシを介して外部サーバーに送られるリクエストでも同じやり方が利用されます。その際は当然、自分で用意するサーバーの受け口がOAuthをサポートしている必要があります。</p>
<p>気になるのは、やはりトークンの交換や、サービスプロバイダ側に認証を行わせる部分が省かれていること。OpenSocialとOAuthは非常に相性が良いと思っていたのですが、認証が出来ないとなると、サービスプロバイダが持つUserIDとコンテナのUserIDを紐付けたりといったことができないことになります。僕が仕様を勘違いしているだけなのか、今後OAuthにもちゃんと対応して行くのか。</p>
<p>makeRequestを使った外部サーバーとのデータ交換については、また別の機会に解説します。</p>
<p>※API(OAuth Tool?)が不安定なようで、お昼はうまくいったのにこの記事を書いている時点では、なぜかNot Foundが返ってきてしまいました・・・</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/42/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
