http://devlog.agektmr.com/ja/archives/597
OpenSocialのSigned Requestは、ガジェットからの外部通信リクエストに署名を付けることで、パラメータの内容が改ざんされていないかを検証可能にする仕組みです。
一般に2-legged OAuthやSigned Request、OAuth Consumer Requestという名前はすべて同じ、これを表しています。実装自体は全く難しくないものなのですが、お手軽なライブラリがあまり出回っていないようなので、作ってみました。
http://devlog.agektmr.com/ja/archives/597
まずはベータとして公開します。
このPHPのライブラリには以下のコードが含まれているみたいです。
- Signed Requestを利用するOpenSocialのサンプルGadget
- Signed Requestを受け取るexample.php
- opensocial_app_url、RSA-SHA1の署名チェックを行うクラス
なるほど。このドキュメントからもリンクされていますね。
http://developer.home.goo.ne.jp/document/%E7%BD%B2%E5%90%8D%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88
mixiの開発者向けドキュメントでも、Signed Requestには説明があり、サンプルコードも載ってます。
http://developer.mixi.co.jp/appli/pc/lets_enjoy_making_mixiapp/require_servers
開発者の思惑どおりgoo homeのOpenSocial Container上で動かす人はたくさんいると思うので、
あえて今回はOpenSocial Containerではなく、SignedRequest=2leggedOAuthのRequestを送信する部分を自前で作ってアクセスしてみました。
■ 1. RSA鍵ペア作成
GoogleのOAuthは既にRSA-SHA1に対応していて、説明がありました。
http://code.google.com/intl/ja/apis/gdata/authsub.html#Registered
■ 2. Signed Requestを作成
こちらも、Google CodeにあるOAuthのライブラリを利用します。
Signature作ってURLにしてcurlでアクセスするだけです。
githubにおいときました。
http://github.com/ritou/php-2leggedOAuth-RequestGenerator/tree/master
■ 3. example.phpを変更
new SignedRequestValidatorの前に自分のConsumerKeyと1作ったpublickeyを突っ込みます。
あとは、
署名の検証に成功した場合のコードは、その後に続けて書けばOKです。
http://devlog.agektmr.com/ja/archives/597
とあるのでてきとーにOAuthのパラメータではないものを書き出してみます。
<?php require_once 'lib/SignedRequestValidator.php'; $additional_pub = array( 'signature_method' => 'RSA_SHA1', 'publickey' => <<<EOD -----BEGIN CERTIFICATE----- (省略) -----END CERTIFICATE----- EOD ); $publickeys['r-weblife.sakura.ne.jp'] = $additional_pub; $validator = new SignedRequestValidator( $opensocial_appurl ); $validator->validate_request(); echo "succeed<br />"; foreach ($_GET as $key => $value) { if( strpos( $key, "oauth_" ) === false ){ echo "Key: $key; Value: $value<br />"; } } ?>
http://r-weblife.sakura.ne.jp/php-2leggedOAuth-RequestGenerator/2leggedOAuthRequestGeneratorTest.php
結果はこんな感じです。
Signed Request Test
request :
http://r-weblife.sakura.ne.jp/SignedRequest/example.php?oauth_version=1.0
&oauth_nonce=458064a1721a19ffcbdbf7c3e37b2c32
&oauth_timestamp=1250362885
&oauth_consumer_key=r-weblife.sakura.ne.jp
&opensocial_app_url=http%3A%2F%2Fr-weblife.sakura.ne.jp%2FSignedRequest%2FSignedRequest.xml
&opensocial_param_a=testValueA
&opensocial_param_b=testValueB
&oauth_signature_method=RSA-SHA1
&oauth_signature=(Signatureの値)response :
succeed
Key: opensocial_app_url; Value: http://r-weblife.sakura.ne.jp/SignedRequest/SignedRequest.xml
Key: opensocial_param_a; Value: testValueA
Key: opensocial_param_b; Value: testValueB
Gadgetからたたかれる人にとってはこれらのパラメータを使って処理をすればいいわけですね。
今回作ったようなものがあると、Conaitanerに載せなくてもSignedRequestを受けるほうの開発に使えるかも?
なんて思ってます。
■ 今後の世の中の流れ
Signed Requestおもしろい
↓
みんなValidator使って実装
↓
OAuthの処理ってそんなに難しくない
↓
3legged OAuthも実装したくなる
↓
OAuth流行る
みたいな流れを期待するのは。。。少々無理がありますかね。