今、データをクラウドに保存する候補として、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 コメント:
コメントを投稿