以前のメモはあまり役に立ちませんでした・・・。
OAuthのライブラリはGoogleのOAuth.php
http://oauth.googlecode.com/svn/code/php/OAuth.php
今回ハマった内容としてはものすごく単純でした。
既存のソースでCURLOPT_POSTFIELDSに対してリクエストパラメータの配列が配列の状態のまま渡っていたため、
BaseStringとかがすごい事になっていたのですが、そうなっている原因がすぐに分からず修正に時間がかかってしまった・・・。
例)HMAC_SHA1の形式でGETリクエストの場合
<?php
include_once 'oauth.php';
$consumerKey = 'XXXXXXXXXXXX';
$consumerSecret = 'XXXXXXXXXXXX';
$accessToken = null;
$method = 'GET';
$url = 'http://XXXX/XXX.php';
$request_params = array(
'a' => 1,
'b' => 2
);
$OAuthConsumer = new OAuthConsumer($consumerKey, $consumerSecret);
$OAuthSignatureMethod = new OAuthSignatureMethod_HMAC_SHA1();
$OAuthRequest = OAuthRequest::from_consumer_and_token($OAuthConsumer, $accessToken, $method, $url, $request_params);
$OAuthRequest->sign_request($OAuthSignatureMethod , $OAuthConsumer, $accessToken);
list($buf, $OAuthAuthorization) = explode(':', $OAuthRequest->to_header(''), 2);
$OAuthAuthorizationHeader = array(
'Authorization:'.$OAuthAuthorization,
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url.'?'.http_build_query($request_params));
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $OAuthAuthorizationHeader);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$res = curl_exec($ch);
例)HMAC_SHA1の形式でPOSTリクエストの場合
<?php
$consumerKey = 'XXXXXXXXXXXX';
$consumerSecret = 'XXXXXXXXXXXX';
$accessToken = null;
$method = 'POST';
$url = 'http://XXXX/XXX.php';
$request_params = array(
'a' => 1,
'b' => 2
);
$OAuthConsumer = new OAuthConsumer($consumerKey, $consumerSecret);
$OAuthSignatureMethod = new OAuthSignatureMethod_HMAC_SHA1();
$OAuthRequest = OAuthRequest::from_consumer_and_token($OAuthConsumer, $accessToken, $method, $url, $request_params);
$OAuthRequest->sign_request($OAuthSignatureMethod , $OAuthConsumer, $accessToken);
list($buf, $OAuthAuthorization) = explode(':', $OAuthRequest->to_header(''), 2);
$OAuthAuthorizationHeader = array(
'Authorization:'.$OAuthAuthorization,
'Content-Type: application/x-www-form-urlencoded',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $OAuthAuthorizationHeader);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($request_params));
$res = curl_exec($ch);
署名をチェック
<?php
include_once 'oauth.php';
$OAuthConsumerKey = 'XXXXXXXXXXXX';
$OAuthConsumerSecret = 'XXXXXXXXXXXX';
$request = OAuthRequest::from_request();
$OAuthSignatureMethod = new OAuthSignatureMethod_HMAC_SHA1();
$consumer = new OAuthConsumer($OAuthConsumerKey, $OAuthConsumerSecret);
if ($OAuthSignatureMethod->check_signature($request, $consumer, null, $request->get_parameter('oauth_signature'))) {
echo 'This signature is OK.';
} else {
echo 'This signature is NG.';
}