2010/01/29

[OAuth][php]UnAuthorizedRequestTokenを取得するリクエスト

今、データをクラウドに保存する候補として、Google App Engineももちろんのこと、Google Fusion Tablesも検討の一つに入れています。

Google Fusion Tables上にあるデータをやりとりするためには、OAuthが必要ということで、さっそく調査をしてみました。

まず、認証の流れはこちらにあってちょっと説明が長いので割愛。

リンク先の1と2について書いてみたいと思います。

UnAuthorizedRequestTokenを取得するためにリクエストを出すのですが、主なパラメータはOAuthGetRequestTokenにあって、これをもとにphpで表現するとこんな感じになりました。

mb_http_output("utf-8");
require_once('HTTP/Request.php');

//urlの設定
$url = 'https://www.google.com/accounts/OAuthGetRequestToken';

$method = "GET";

$params["oauth_callback"] = rawurlencode("コールバック先のurl");
$params["oauth_consumer_key"] = "anonymous";
$params["oauth_nonce"] = md5(microtime().mt_rand());
$params["oauth_signature_method"] = "HMAC-SHA1";
$params["oauth_signature"] = "";
$params["oauth_timestamp"] = time();
$params["oauth_version"] = "1.0";

$params["scope"] = rawurlencode("http://tables.googlelabs.com/api/query");

$params["oauth_signature"] = make_Signature_Base_String($method,$url,$params);
$params["oauth_signature"] = base64_encode(hash_hmac("sha1" ,$params["oauth_signature"],"anonymous&",true));

$request = new HTTP_Request();
$request->setURL($url);

$request->addHeader("Authorization"," OAuth");

$request->
addQueryString("oauth_callback",$params["oauth_callback"],true);
$request->
addQueryString("oauth_consumer_key",$params["oauth_consumer_key"],false);
$request->
addQueryString("oauth_nonce",$params["oauth_nonce"],false);
$request->
addQueryString("oauth_signature_method",$params["oauth_signature_method"],false);
$request->
addQueryString("oauth_signature",$params["oauth_signature"],false);
$request->
addQueryString("oauth_timestamp",$params["oauth_timestamp"],false);
$request->
addQueryString("oauth_version",$params["oauth_version"],false);

$request->addQueryString("scope",$params["scope"],true);

//メソッドをセット
$request->setMethod($method);

//リクエストを実行
$result = $request->sendRequest();
$ret = $request->getResponseBody();

print($ret);

function make_Signature_Base_String($aMethod,$aUrl,$aParams){
$ret = "";
foreach($aParams as $key => $value){
if($key != "oauth_signature"){
$ret = $ret."&".$key."=".$value;
}
}
$ret = substr($ret,1);
$ret = rawurlencode($ret);
$ret = $aMethod."&".rawurlencode($aUrl)."&".$ret;
return $ret;
}

これを実行すると、結果として
oauth_token=hoge1&oauth_token_secret=hoge2&oauth_callback_confirmed=true

みたいな感じで表示されると思います。

一番悩んだのが、oauth_signatureを作り方。。。
(まる3日間悩みました。)

アルファベット順に並べてエンコードをかけるというところまではオッケーだったのですが、コールバック関数にあらかじめエンコードをかけておく必要があり(つまり2回エンコードする)、さらに、hash_hmac関数の第二引数の最後に「&」が必要だというのに気づくのにすっげー苦労した。

どうして気がついたのかというと、[OAuth]PHPを読んだことある人のためのOAuthのSignature解説に紹介されていたPHP用ライブラリのプログラムを読んで気がつきました。

次回は、ここら先について書きいきたいと思います。

0 コメント:

コメントを投稿