<?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/tag/oauth/feed" rel="self" type="application/rss+xml" />
	<link>http://devlog.agektmr.com</link>
	<description>SocialWeb Evolves</description>
	<lastBuildDate>Tue, 10 Aug 2010 15:55:50 +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>OpenSocial Signed Request Library(PHP) Beta</title>
		<link>http://devlog.agektmr.com/en/archives/597</link>
		<comments>http://devlog.agektmr.com/en/archives/597#comments</comments>
		<pubDate>Thu, 13 Aug 2009 16:31:58 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Signed Request]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=597</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F597", "style": "big", "title": "OpenSocial Signed Request Library(PHP) Beta" });
Signed Request in OpenSocial is a convenient solution for gadget developers to verify their remote content request is not spoofed. You can pick signature attached to the request and verify that no params are changed, added or removed.
Implementing this is not difficult, but since [...]]]></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%252F597%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenSocial%20Signed%20Request%20Library%28PHP%29%20Beta%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F597", "style": "big", "title": "OpenSocial Signed Request Library(PHP) Beta" });</script></div>
<p>Signed Request in OpenSocial is a convenient solution for gadget developers to verify their remote content request is not spoofed. You can pick signature attached to the request and verify that no params are changed, added or removed.</p>
<p>Implementing this is not difficult, but since I don&#8217;t see any library, easy to use out of the box, I hereby introduce <a href="http://code.google.com/p/opensocial-signed-request-php-library/" target="_blank">opensocial-signed-request-php-library</a> as beta.</p>
<p>This library is using OAuth Library on Google Code. Major container&#8217;s public keys are included: orkut, Google, Friendster, hi5, hyves, Netlog, mixi and goo Home.</p>
<h2>How to use</h2>
<p>Check out from Google Code:</p>
<pre>svn checkout http://opensocial-signed-request-php-library.googlecode.com/svn/trunk/ opensocial-signed-request-php-library-read-only</pre>
<p>Looking at <a href="http://code.google.com/p/opensocial-signed-request-php-library/source/browse/trunk/example.php" target="_blank">sample implementation</a> should be the easiest way to learn. Instantiate SignedRequestValidator with gadget&#8217;s url, do validate_request(). that&#8217;s it. If validation fails, library will respond 401 and die. Further code can be written after that. It&#8217;s that simple.</p>
<h2>Other known libraries</h2>
<p>There&#8217;s a few libraries doing similar things, I know useful.</p>
<ul>
<li>Google AppEngine Python, Django library: <a href="http://code.google.com/p/gaeoauth/" target="_blank">gaeoauth</a></li>
<li>Apache module: <a href="http://code.google.com/p/mod-auth-opensocial/" target="_blank">mod_auth_opensocial</a></li>
</ul>
<h2>Give me feedback</h2>
<p><a style="text-decoration: none; color: #000000;" href="http://code.google.com/p/opensocial-signed-request-php-library/">opensocial-signed-request-php-library</a> should work straight. But in case you find bug, better API, please give me feedback. It&#8217;s still beta :)</p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/597/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>FriendConnectから垣間見える未来のソーシャルウェブ</title>
		<link>http://devlog.agektmr.com/en/archives/77</link>
		<comments>http://devlog.agektmr.com/en/archives/77#comments</comments>
		<pubDate>Thu, 19 Jun 2008 17:49:38 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[DataPortability]]></category>
		<category><![CDATA[FriendConnect]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[SocialWeb]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[PortableContacts]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=77</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F77", "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%252F77%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22FriendConnect%E3%81%8B%E3%82%89%E5%9E%A3%E9%96%93%E8%A6%8B%E3%81%88%E3%82%8B%E6%9C%AA%E6%9D%A5%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%82%A6%E3%82%A7%E3%83%96%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F77", "style": "big", "title": "FriendConnectから垣間見える未来のソーシャルウェブ" });</script></div>
<p>今更ですが、先日サンフランシスコで開かれたGoogle I/Oに参加してきました。</p>
<p>その中でも特に印象に残ったのが、PlaxoのJoseph Smarr氏によるOpenSocial, OpenID, and OAuth: Oh My!というセッション。僕が見たセッションの中ではダントツの人気で、部屋に用意された椅子はもちろん、立ち見で人が溢れ返るほどの盛況ぶり。</p>
<p>内容は、ソーシャルウェブの未来について。現在はOpenSocialというソーシャルグラフを所有するサービスに閉じた世界が中心となりつつありますが、少し未来のウェブはOpenSocial, OpenID, OAuth, <a href="http://www.portablecontacts.net/" target="_blank">PortableContacts</a>等の技術によって、よりグローバルな意味でのソーシャル化が図れるようになる、というものです。</p>
<p>詳細は<a href="http://sites.google.com/site/io/opensocial-openid-and-oauth-oh-my" target="_blank">Google Codeにビデオとスライドがアップされています</a>ので、ご覧ください。かなり早口ですが、大変面白い内容です。</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="wmode" value="transparent" /><param name="src" value="http://www.youtube.com/v/6SYnlH5FXz0" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/6SYnlH5FXz0" wmode="transparent"></embed></object></p>
<h2>OpenSocialとFriendConnectの持つ意味</h2>
<p>OpenSocialにはv0.7まで、JavaScriptのAPIしか存在していませんでした。これはOpenSocialコンテナにとっては外部サービスからガジェットとしてアプリケーションを追加してもらい、そのOpenSocialコンテナが持つソーシャルグラフに閉じた形で利用されるものでした。アプリケーション開発者はOpenSocialのJavaScript APIを使い、ガジェットが置かれているコンテナサイトの友達リストを取得し、そこでアプリケーションを動かすことができます。もちろん、ガジェットを自分のサービスドメイン上でホスティングすることも可能ですが、ガジェットはコンテナ上でしか動作せず、友達リストを外部サービスとしてインポートしたりといったことも不可能で、実質的に囲い込みサービスしか生まれないものと言えたでしょう。</p>
<p>それがOpenSocial v0.8 + FriendConnectによって一気に世界を広げます。ユーザーはFriendConnect対応サイトを利用するに当たり、OAuthを使って自分が利用したいSNSサービスを選ぶ権利が与えられています。同時に、そのサイト上での活動内容は連携を選択したSNSサービスに戻されます。</p>
<p>ここでソーシャルサービスの要素を思い出してください。</p>
<ol>
<li>アイデンティティ</li>
<li>ソーシャルグラフ(友達リスト)</li>
<li>エントリの公開範囲の制御(プライバシー)</li>
<li>フィード</li>
</ol>
<p><strong>FriendConnectはアイデンティティをOpenIDで、ソーシャルグラフをOpenSocial v0.8のRESTful APIで、エントリの公開範囲の制御をOAuthで、フィードをActivity Streamで解決しようとしています。</strong></p>
<p>これらの意味するところを深く見つめて行くと、未来のソーシャルウェブが自ずと見えてきます。</p>
<h2>Joseph Smarr氏(Plaxo)による未来のソーシャルウェブ論</h2>
<p>FriendConnectのイメージをさらに深めるため、Joseph Smarr氏が、PlaxoのFriendConnect対応に際してアップしていたブログエントリをご紹介します。</p>
<p><a class="entryheader" href="http://blog.plaxo.com/archives/2008/06/plaxo_and_frien_1.html">Plaxo and FriendConnect are now Best Friends</a></p>
<blockquote><p>Plaxoが完全にFriendConnectと連携した。FriendConnectとは、あらゆるサイトをソーシャル化する、Googleによるウィジェットベースのツールである。これにより、FriendConnectに対応していれば、どんなサイトでもPlaxoアカウントに安全に接続し、サイト上に自分の友達がいるかを確認したり、友達を招待したりといったことができるようになる。何よりも素晴らしいのは、そのサイトでの活動内容をPulseに流し込むことができるようになり、Plaxoでの友達がウェブを跨いであなたと連絡を取り合うことができ、あなたが発見した新しいサイトを知ることができる点だ。</p>
<p>これは本当に便利でわくわくする連携機能だ &#8212; これはユーザーが自分のアイデンティティと関係をウェブ上のどこでも利用できるようにし、新しいサイトで知人を見つけ出し、活動内容を既存の友達に共有し、よりソーシャルな発見と共有という徳の高いサイクルを生み出す、<a href="http://therealmccrea.com/2008/05/02/can-lifestreaming-and-aggregation-go-mainstream/" target="_blank">シームレスソーシャルウェブエコシステム</a>にさらに近付いたと言える。これこそソーシャルウェブの進むべき道だ &#8212; (現在あるほとんどのサービスがそうだが)新しいソーシャルサイトを使い始める度に最初からやり直さなければならないなんてとんでもない。あなたの新しい体験全てが、他の人をも魅了すべきだ。</p>
<p>これはサービスがユーザーに自分の持つデータの制御を与え、オープンスタンダードを使って安全なアクセス権を提供することによってのみ成り立つ。そしてこれこそまさに、PlaxoがFriendConnectを使ってやりたかったことだ。Plaxoアカウントを接続する際、我々は<a href="http://oauth.net/" target="_blank">OAuth</a>を使う。そのため、Plaxoのパスワードを渡す必要もないし、後で接続を断つことも可能だ。FriendConnectを使ってあなたが活動内容をPulseに共有する際は、<a href="http://devlog.agektmr.com/wiki/index.php?cmd=read&amp;page=OpenSocial%2FRESTful%20API%20Specification" target="_blank">OpenSocial 0.8 RESTful Activities API</a>を利用する。オープンスタンダードではない連携はアドレス帳APIのみであり、我々はこのスタンダードについても<a href="http://portablecontacts.net/" target="_blank">取り組みを開始している</a>。我々は<a href="http://blog.plaxo.com/archives/2008/05/plaxo_becomes_s.html" target="_blank">アイデンティティプロバイダとして、ソーシャルグラフプロバイダとして、そしてコンテンツアグリゲータとしての役割</a>を果たしていると強く信じている &#8212; つまり、我々はユーザーが自身のデータと関係性をウェブ上のどこにでも持ち回り、どこからでも共有できるようにしている &#8212; これはユーザーにとっても、Plaxoにとっても、ウェブ全体にとっても有益なことだ。だが、まだこの取り組みは始まったばかり &#8212; FriendConnect対応サイトから活動内容を共有する際、家族や友達、仕事関係など、共有相手をより細かい粒度で制御するなどの、更なる拡張を楽しみにしていて欲しい。</p>
<p>下のスクリーンショットはPlaxoとGoogle FriendConnectの連携したものだ &#8212; <a href="http://www.google.com/friendconnect/home/examples" target="_blank">FriendConnectを利用しているサイト</a>でも体験してもらうことができる。</p></blockquote>
<p>画像は<a href="http://blog.plaxo.com/archives/2008/06/plaxo_and_frien_1.html" target="_blank">実際のページ</a>をご覧下さい。</p>
<h2>まとめ</h2>
<p>ガジェットコンテナとしてのOpenSocialには正直、懐疑的な部分があったのですが、FriendConnectの描く未来を想像し、またわくわくしています。今後もこの辺りの動向を追って行きます。</p>
<h2>追記</h2>
<p>似たような話題に触れた記事を見つけたので追記し、トラバっておく。(失敗したので断念○|￣|＿)</p>
<p><a href="http://japan.cnet.com/special/story/0,2000056049,20375542,00.htm" target="_blank">グーグルが見たソーシャルネットワーキング&#8211;その3つの傾向:スペシャルレポート &#8211; CNET Japan</a></p>

]]></content:encoded>
			<wfw:commentRss>http://devlog.agektmr.com/en/archives/77/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>
