<?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; Data Availability</title>
	<atom:link href="http://devlog.agektmr.com/en/archives/tag/data-availability/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>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>SNSのオープン化</title>
		<link>http://devlog.agektmr.com/en/archives/66</link>
		<comments>http://devlog.agektmr.com/en/archives/66#comments</comments>
		<pubDate>Tue, 13 May 2008 18:05:18 +0000</pubDate>
		<dc:creator>Eiji</dc:creator>
				<category><![CDATA[DataPortability]]></category>
		<category><![CDATA[Data Availability]]></category>
		<category><![CDATA[Facebook Connect]]></category>
		<category><![CDATA[FriendConnect]]></category>

		<guid isPermaLink="false">http://devlog.agektmr.com/en/?p=66</guid>
		<description><![CDATA[
topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F66", "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%252F66%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22SNS%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E5%8C%96%22%20%7D);"><script type="text/javascript">topsyWidgetPreload({ "url": "http%3A%2F%2Fdevlog.agektmr.com%2Fen%2Farchives%2F66", "style": "big", "title": "SNSのオープン化" });</script></div>
<h2>SNSをオープン化する動き</h2>
<p>Facebookの開発者向けプラットフォーム公開に始まったSNSのオープン化は、さらに加速度を増しています。Facebookの対抗と言わんばかりに登場したGoogle主導のOpenSocial。Facebookが自社サービスをプロプライエタリな基盤にする動きであったのに対し、Googleはその他大勢の連合を擁して、基盤の標準といえる規格を作りました。</p>
<p>両者のこの動きは、外部サービスをSNSの一部であるかのように取り込むという意味で共通しています。</p>
<h2>SNSアグリゲートサービス</h2>
<p>日本でSNSというとmixiを代表とした日記交換サイトがイメージされがちですが、Twitterのように一方通行の「Follow」が可能なものや、Flickr、Lastfm等のジャンルに特化したものもSNSと呼ぶことができます。</p>
<p>最近FriendFeedのように、こういった各種SNSをアグリゲートすることに特化したサービスも登場してきました。サービスに各種SNSのIDを預けることで、フィードのアグリゲーションが行われ、ユーザーはそのサイトさえ追いかけていれば必要な時だけ連携サービスを見に行くことができるようになります。</p>
<p>このように、ウェブの求める方向性はSNSの登場以降、<strong>IDがウェブ上のあちこちにあったとしても、使っている本人は一人であり、友達も同じなのだから、まとめちゃえばいいじゃん</strong>、にシフトしてきています。</p>
<h2>DataPortability</h2>
<p>DataPortabilityはそんな各SNSサービスに囲い込まれつつあるデータを解放して相互に利用できるようにしよう、という動きです。</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="225" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="quality" value="best" /><param name="allowfullscreen" value="true" /><param name="scale" value="showAll" /><param name="src" value="http://www.vimeo.com/moogaloop.swf?clip_id=610179&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=" /><embed type="application/x-shockwave-flash" width="400" height="225" src="http://www.vimeo.com/moogaloop.swf?clip_id=610179&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=" scale="showAll" allowfullscreen="true" quality="best"></embed></object><br />
<a href="http://www.vimeo.com/610179?pg=embed&amp;sec=610179">DataPortability &#8211; Connect, Control, Share, Remix</a> from <a href="http://www.vimeo.com/smashcutmedia?pg=embed&amp;sec=610179">Smashcut Media</a> on <a href="http://vimeo.com?pg=embed&amp;sec=610179">Vimeo</a>.<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="225" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="quality" value="best" /><param name="allowfullscreen" value="true" /><param name="scale" value="showAll" /><param name="src" value="http://www.vimeo.com/moogaloop.swf?clip_id=990474&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=" /><embed type="application/x-shockwave-flash" width="400" height="225" src="http://www.vimeo.com/moogaloop.swf?clip_id=990474&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=" scale="showAll" allowfullscreen="true" quality="best"></embed></object><br />
<a href="http://www.vimeo.com/990474?pg=embed&amp;sec=990474">DataPortability &#8211; Join The Conversation</a> from <a href="http://www.vimeo.com/smashcutmedia?pg=embed&amp;sec=990474">Smashcut Media</a> on <a href="http://vimeo.com?pg=embed&amp;sec=990474">Vimeo</a>.</p>
<p>詳細は僕もつかみきれていませんが、MySpaceのData Availability, FacebookのFacebook Connect, GoogleのFriend Connectと役者が揃ってきました。それぞれがどういう特徴を持っているのかを、追って紹介していきます。</p>

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