前に「OAuth Consumer Request の処理フローと実装」で紹介した 2-legged OAuth 処理のPHP版です。
通常の OAuth では、ユーザの確認画面を間に挟んでトークンのやり取りを行いますが、OAuth Consumer Request は既に信頼関係にあるという前提でトークン発行、承認の手順を省いたものです。コンシューマとサービスプロバイダ二者間での信任フロー(2-legged OAuth)になります。詳しい仕様については下記を参照してください。
» OAuth Consumer Request 1.0 Draft 1まずは、実際の処理手順を説明していきましょう。コンシューマは次のパラメータをサービスプロバイダに送信することになります。 Consumer Key と Consumer Secret については、サービスプロバイダから提供されているものを使います。
| oauth_consumer_key | コンシューマキー |
| oauth_signature_method | HMAC-SHA1 or RSA-SHA1 |
| oauth_signature | シグニチャ |
| oauth_timestamp | UNIXタイムスタンプ |
| oauth_nonce | ランダムな文字列 |
| oauth_version | 1.0 (オプション) |
ここで、 oauth_signature は以下のようにして生成されます。まず、ベース文字列を用意します。
- GET
- http://api.gu3.jp/v1/test/auth
- oauth_consumer_key=yamashita.dyndns.org&oauth_nonce=c83b1847200
bd25d918c3fb077aca16f&oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1219931263&oauth_version=1.0
次にこれらをURIエスケープした後に & で連結して、ベース文字列を生成します。
GET&http%3A%2F%2Fapi.gu3.jp%2Fv1%2Ftest%2Fauth&oauth_consumer_key %3Dyamashita.dyndns.org%26oauth_nonce%3Dc83b1847200bd25d918c3fb0 77aca16f%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp %3D1219931263%26oauth_version%3D1.0
そして、このベース文字列を HMAC-SHA1 によってダイジェスト値を生成し、BASE64 でエンコードすることによってシグニチャを生成します(サービスプロバイダによっては RSA-SHA1 の場合もあります)。この際、利用する共有キーは cosumer_secret と 空のToken Secret を & で連結したものになります。例えば、 consumer_secret が kd94hf93k423kf44 なら kd94hf93k423kf44& になります。こうして、シグニチャは以下のようになります。
M32qYtcaUD8b1Kb/AponRG5hrwI=
こうして生成されたパラメータをAPIリクエスト時の Authorization ヘッダに追加して、サービスプロバイダに送信します。
Authorization: OAuth realm="http://api.gu3.jp/",
oauth_consumer_key="yamashita.dyndns.org",
oauth_signature_method="HMAC-SHA1",
oauth_signature="M32qYtcaUD8b1Kb%2FAponRG5hrwI%3D",
oauth_timestamp="1219931263",
oauth_nonce="c83b1847200bd25d918c3fb077aca16f",
oauth_version="1.0"
実際のPHPスクリプトは次のようになります。なお、実行には Google Code にて公開されているPHP用ライブラリ(OAuth.php)が必要です。
<?php
require_once 'OAuth.php';
define('CONSUMER_KEY', 'yamashita.dyndns.org');
define('CONSUMER_SECRET', 'kd94hf93k423kf44');
function OAuthConsumerRequest($method, $url, $data=NULL) {
$consumer = new OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
$signature_method_hmac_sha1 = new OAuthSignatureMethod_HMAC_SHA1();
// access protected resources
$oauth_request = OAuthRequest::from_consumer_and_token($consumer,
NULL,
$method,
$url);
$oauth_request->sign_request($signature_method_hmac_sha1,
$consumer, '');
$headers = $oauth_request->to_header();
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array($headers));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
if ($result === FALSE) {
return curl_error($ch);
}
curl_close($ch);
return $result;
}
$ret = OAuthconsumerRequest('GET', 'http://api.gu3.jp/v1/test/auth');
print($ret);























