OAuth CrossDomain JavaScript Proxy を作った

何ができるか

OAuth(3-legged)のAPIJavaScriptクライアントから簡単に呼べるようになります。
プログラム的には非同期の呼び出しのみで記述でき、面倒な手続き(トークンのやり取り、同意画面の表示など)はプロキシ側で完了します。
プロキシサービスはGoogle App Engine上で動いてます。

コード例

http://xdoauthproxy.googlecode.com/svn/trunk/assets/example.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>Example Client : OAuth CrossDomain JavaScript Proxy</title>
    <script type="text/javascript" src="http://xdoauthproxy.appspot.com/js/json2.js"></script>
    <script type="text/javascript" src="http://xdoauthproxy.appspot.com/js/xd-oauth-client.js"></script>
    <script type="text/javascript">
function startXdRequest() {
  XdOAuth.init('http://xdoauthproxy.appspot.com/xd-server.html'); // プロキシサービスのURLを指定して初期化
  XdOAuth.request({
    url : 'http://www.google.com/calendar/feeds/default/private/full?alt=json', // OAuthによるアクセス制御がかかったAPIエンドポイント
    success : function(data) {
      var result = eval('(' + data + ')');
      var html = [];
      for (var i=0; i<result.feed.entry.length; i++) {
        var entry = result.feed.entry[i];
        html.push('<li>'+entry.title.$t+'</li>');
      }
      document.getElementById('result').innerHTML = html.join('');
    },
    error : function(res) {
      alert(res.status + ':' + res.body);
    }
  });
}
    </script>
  </head>
  <body>
    <!-- place dummy image file on the same domain where client html file is located. -->
    <img src="./img/s.gif" />
    <input type="button" onclick="startXdRequest()" value="Start OAuth Request to get private Google Calendar">
    <ul id="result"></ul>
  </body>
</html>

OpenSocialのOAuth Proxyとはちがうのか?

JavaScriptからOAuthにアクセスできるという点で似てると思いますが、ガジェット外で利用できる(=コンテナを必要としない)点が違います。
意味合い的には、FriendConnect API + OpenSocial OAuth Proxy - OpenSocial でしょうか。

対応するOAuth API

Google系のサービスとMyspace, Twitter, Smart.fm に対応してます。Yahooも時間あったらやります。
えーじさんにリストをもらいましたが、ほとんど登録すらしてないので試すのが難しいんで、後にします。

注意点

リクエスト時にポップアップウィンドウで同意画面を出すため、xdoauthproxy.appspot.com に対してウィンドウポップアップブロッカーを無効にしておく必要があります。

制限事項

初期版はGETのみです。POSTの実装はさぼってますが、きっとちょっとやれば何とかなります。

その他

多分にコンセプト的です。バグ多いと思います。その点理解して使ってください。
Python+GAEの習作でもあるため、コードはあまり美しくないと思います。

原理的に2回データの流れを承認する画面が発生します(OAuth Provider -> xdoauthproxy.appspot.com の同意、xdoauthproxy.appspot.com -> JSを埋め込んだサイトのドメインへの同意)。そのためちょっと冗長です。

クライアント側は全部ブラウザで動くJSなので、ブックマークレットで呼ぶとかも比較的簡単だと思います。事前登録とかもしません。セキュリティのために最低限のことはやってるつもりですが、おそらく最低限です。サイトの真正性確認の方法は、必要があれば別エントリにしますが、OAuthの署名に比べればDNSに依っているので弱いほうです。

GreaseMonkeyとかから使うのはあまり想定してませんが、そもそも必要ですかしらね?