OpenSocial Signed Requestライブラリ(PHP)は便利ですよ!

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流行る

みたいな流れを期待するのは。。。少々無理がありますかね。