2010/02/12

[PHP]OAuth最終確定版

やっとOAuthのログインがスムーズに行くようになりました。

こちらの記事にものすごくわかりやすい説明があったので、結局、それを参考に実装しました。

前提条件として、こちらにあるOAuth.phpとOAuth_TestServer.phpの2つをアップロードして、あらかじめプログラムにincludeしておきます。

まず、https://www.google.com/accounts/OAuthGetRequestTokenにアクセスするところまで

$consumer['key'] = 'anonymous';
$consumer['secret'] = 'anonymous';
$consumer = new OAuthConsumer($consumer['key'], $consumer['secret'], NULL);

$server = new TestOAuthServer(new MockOAuthDataStore());
$server->add_signature_method(new OAuthSignatureMethod_HMAC_SHA1());

$sig_methods = $server->get_signature_methods();
$sig_method = $sig_methods['HMAC-SHA1'];

$endpoint = "https://www.google.com/accounts/OAuthGetRequestToken";

$request = OAuthRequest::from_consumer_and_token($consumer, NULL, "GET", $endpoint, array("scope"=>"http://tables.googlelabs.com/api/query"
,"oauth_callback"=>"リダイレクト先のURL"));
$request->sign_request($sig_method, $consumer, NULL);

$req = curl_init($request);
curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($req);

次に、https://www.google.com/accounts/OAuthAuthorizeTokenへの問い合わせについて

//tokens配列に問い合わせの結果をセットする
parse_str($result, $tokens);

$_SESSION["oauth_token_secret"] = $tokens["oauth_token_secret"];

$auth_url = "https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=".urlencode($tokens['oauth_token'])."&hl=jp";
$req = curl_init($auth_url);
curl_setopt($req, CURLOPT_HEADER, TRUE);
curl_setopt($req, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($req);

list($header) = explode("\r\n\r\n", $result, 2);
$matches = array();

preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
$url = trim(array_pop($matches));

//リダイレクトを行う
header('Location: '.$url);

この後、前回と違って、いきなりリダイレクトが開始されます。
(前回は、2回ログインする必要がありました。)

で、許可のボタンを押すと、リダイレクト先のurlに飛びますので、引き続き、そこから先の処理について。
$consumer['key'] = 'anonymous';
$consumer['secret'] = 'anonymous';
$consumer = new OAuthConsumer($consumer['key'], $consumer['secret'], NULL);

$server = new TestOAuthServer(new MockOAuthDataStore());
$server->add_signature_method(new OAuthSignatureMethod_HMAC_SHA1());

$sig_methods = $server->get_signature_methods();
$sig_method = $sig_methods['HMAC-SHA1'];

$endpoint = "https://www.google.com/accounts/OAuthGetAccessToken";
$tokener = new OAuthConsumer($_GET['oauth_token'],
https://www.google.com/accounts/OAuthGetRequestTokenの問い合わせの時にゲットしたoauth_token_secret);
$access = OAuthRequest::from_consumer_and_token($consumer, $tokener, "GET", $endpoint, array("oauth_verifier"=>$_GET["oauth_verifier"]));
$access->sign_request($sig_method, $consumer, $tokener);
$req = curl_init($access);
curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($req);

で、これの問い合わせの結果、oauth_token_secretと、oauth_tokenをゲットします。

$endpoint = "http://tables.googlelabs.com/api/query";
parse_str($result, $tokens);
$consumer = new OAuthConsumer('anonymous', 'anonymous', NULL);
$tokener = new OAuthConsumer($tokens['oauth_token'], $tokens['oauth_token_secret']);
$resource = OAuthRequest::from_consumer_and_token($consumer, $tokener, "GET", $endpoint, array('sql'=>'SHOW TABLES'));
$resource->sign_request($sig_method, $consumer, $tokener);
$req = curl_init($resource);
curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($req);

//デバッグ
print($result);

exit();

printの結果、正常に処理が返されました。

うーん、しかし、結局のところ、何が問題だったのだろうか?

ここから先は、推測ですが、おそらく、問い合わせにcurlを使わなかったのが原因なのではないかと。

リクエストの方法が違うだけでこうも結果に違いがでちゃうんだよなー。

CFと違ってPHPは、たくさん関数があるので一日でも早く慣れたいですね。

さっき東武練馬で50歳の恋愛白書を見たんだけど、全然、おもしろくなかった。
当初、キアヌリーブスが助演するということで、タイトル的にも、恋愛適齢期を想定して見に行ったのに、タイトルと内容があっていないような。。。

0 コメント:

コメントを投稿