PHP で OAuth Consumer Request (2-legged OAuth)

前に「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_methodHMAC-SHA1 or RSA-SHA1
oauth_signatureシグニチャ
oauth_timestampUNIXタイムスタンプ
oauth_nonceランダムな文字列
oauth_version1.0 (オプション)

ここで、 oauth_signature は以下のようにして生成されます。まず、ベース文字列を用意します。

  1. GET
  2. http://api.gu3.jp/v1/test/auth
  3. 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);

PHPからMecabを利用する拡張モジュール

PHPからMecabを使いたかったので、Page2さんで公開されているPHP拡張モジュールを試してみた。試したのは、PHP5とMecab 0.95という組み合わせ。

  1. ソースのダウンロード
    $ wget http://page2.xrea.jp/pub/php_mecab-0.2.0.tgz
    $ tar zxvf php_mecab-0.2.0.tgz
  2. コンパイルとインストール
    $ cd php_mecab-0.2.0
    $ /usr/bin/phpize
    $ ./configure --with-php-config=/usr/bin/php-config \
    --with-mecab=/usr/bin/mecab-config
    $ make
    $ sudo make install
  3. 動作確認
    <?php
    dl('mecab.so');
    
    $t = new MeCab_Tagger();
    $str = 'すもももももももものうち';
    
    echo $t->parse($str);

    実行結果1

    す      接頭辞,名詞接頭辞,*,*,す,す,*
    もも    名詞,普通名詞,*,*,もも,もも,代表表記:股
    も      助詞,副助詞,*,*,も,も,*
    もも    名詞,普通名詞,*,*,もも,もも,代表表記:股
    も      助詞,副助詞,*,*,も,も,*
    もも    名詞,普通名詞,*,*,もも,もも,代表表記:股
    の      助詞,接続助詞,*,*,の,の,*
    うち    名詞,副詞的名詞,*,*,うち,うち,*
    EOS

    問題なく動作しているようだけど、「すもも」が一つの名詞として認識されてなくて、「す」+「もも」という変な組み合わせになっている。次に辞書をJumanからipadicに変更してみる。

    <?php
    dl('mecab.so');
    $options = array('-d', '/var/lib/mecab/dic/ipadic');
    
    $t = new MeCab_Tagger($options);
    $str = 'すもももももももものうち';
    
    print $t->parse($str);

    実行結果2

    すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
    も      助詞,係助詞,*,*,*,*,も,モ,モ
    もも    名詞,一般,*,*,*,*,もも,モモ,モモ
    も      助詞,係助詞,*,*,*,*,も,モ,モ
    もも    名詞,一般,*,*,*,*,もも,モモ,モモ
    の      助詞,連体化,*,*,*,*,の,ノ,ノ
    うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
    EOS

    今度はちゃんと認識してくれた。素晴らしい!