isseium's blog

田舎に住むWebエンジニアのブログ

PECL(PHP) OAuth を用いたYahoo! Japan OAuth の利用

※isseiumが2009/08/09に書いた記事を、移転のため転載したものです。情報が古い可能性があります。


OAuth とは,簡単に言うと,ユーザに対してWeb APIのアクセス権を認可して使えるようにするプロトコルです.


具体的には,Yahoo! オークションのウォッチリストっていうのは,ログインしないと見ることができない情報です.
OAuthを用いることで,ログインが必要な情報を,他のサイトが自由,かつセキュアにアクセスできるようになります.


Yahoo! Japan でも 7月10日からスタートしています.ってことで,実際に使ってみた.


参考にしたページはYahoo! デベロッパーネットワーク.(http://developer.yahoo.co.jp/other/oauth/
参考ページがOAuthの説明で省略している部分と間違いがあってちょっと手こずりましたが,なんとか実現しました.


というわけで,PHP OAuth(PECL)を用いたYahoo! Japan OAuth 利用のメモです.

Yahoo! Japanへの利用登録

  1. Yahoo! Japan ID の登録(省略)
  2. アプリケーションIDの登録

ここで,できます.(http://e.developer.yahoo.co.jp/webservices/register_application
特に難しくないので,省略.注意点としては,ドメインを持っている必要があります.

PHP の準備

自分のサーバ等でPHPの設定をします.あらかじめ管理者権限のあるユーザに切り替えるか,sudo を使って実行してください.

php-devl のインストール
    yum install php-devl
libcurl のインストール (最新版はここ:http://curl.haxx.se/download.html
    wget http://curl.haxx.se/download/curl-7.19.5.tar.gz
    tar xvzf curl-7.19.5.tar.gz
    cd curl-7.19.5
    ./configure
    make
    make install
PECL OAuth のインストール
    pecl install oauth-beta
/etc/php.ini の適当なところに以下を追加
    extension=oauth.so (php ファイルで毎回 dl("oauth.so") を実行でもOK)
Apache をリスタート
    /etc/init.d/httpd restart

以上で,PHPの準備は終了です.

Yahoo! Japan OAuth を使ってみる

OAuthのフローが掲載されていますので,参考にする.( http://developer.yahoo.co.jp/other/oauth/flow.html
すべてのフローは1つのファイルで終えることができるけれど,わかりやすいように2つのファイルに分割した.

Request Token の取得 と End User の認可(oauth.php
    <?php
    $req_url = 'https://auth.login.yahoo.co.jp/oauth/v2/get_request_token';
    $callback_url = 'http://○○○.com/path/to/oauth2.php'; // 認証後に遷移するURL

    $conskey = 'ここにConsumer Key'';
    $conssec = 'ここにConsumer Key の署名(Secret)';

    session_start();

    try {

    // OAuth インスタンスの生成
    $oauth = new OAuth($conskey, $conssec);

    // リクエストトークンの取得
    $requestToken = $oauth->getRequestToken($req_url, $callback_url);
    $_SESSION['requestToken'] = $requestToken;  // 結果をセッションに保持(OAuth2.phpで利用するため)
    var_dump($requestToken);

    // Yahoo! Japan での認可
    header('Location: ' . $requestToken['xoauth_request_auth_url']);

    } catch(OAuthException $e){
    var_dump($e);
    }
Access Token の取得(OAuth2.php
    <?php
    $acc_url = 'https://auth.login.yahoo.co.jp/oauth/v2/get_token';

    $conskey = 'ここにConsumer Key'';
    $conssec = 'ここにConsumer Key の署名(Secret)';

    session_start();

    try {
    // OAuth インスタンスの生成
    $oauth = new OAuth($conskey, $conssec, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);

    // アクセストークンの取得
    $oauth->setToken( $_SESSION['requestToken']['oauth_token'] , $conssec . '&' . $_SESSION['requestToken']['oauth_token_secret']);
    $res = $oauth->getAccessToken($acc_url , $_GET['oauth_verifier']);

    var_dump($res);
    } catch(OAuthException $e){
    var_dump($e);
    }

以上で完成です.このスクリプトだとアクセスキーのダンプが表示されます.(肝心のOAuthの活用については後日掲載予定)

あとがき

リファレンスの3. Access Token の取得の一部がわかりにくかった.リファレンスには

oauth_sigunature
Consumer Secretの値。PLAINTEXTのまま署名する場合は値の末尾に%26を付加します。HMAC-SHA1を使用する場合はOAuth Core 1.0 Rev.A Spec, Section 9.2.を参照してください。署名方式についてはリクエストの署名を参照してください。

とあり,oauth_sigunature には Consumer Secret の値をセットしろと書いているけど,正確には,Consumer Secret と Request Token を合わせた値.これを見つけるのに2時間はかかりました.OAuthの仕様を知っている人ならいいかもしれないけれど,ちょっと不親切だと思いましたね.ということで,setTokenでは

    $conssec . $_SESSION['requestToken']['oauth_token_secret']

という感じで,2つの値を連結させてセットします.

http://developer.yahoo.co.jp/other/oauth/signinrequest.html によると,

この正規化された文字列を、Consumer SecretとToken Secretを"&"で連結した値をキーにして署名してください。

と書いてあった. ただ連結しただけでもうまくいったので,"&"は必要ないかもしれないけれど,リファレンスに則ったほうがよいですね.というわけで,setTokenでは

    $conssec .  '&' . $_SESSION['requestToken']['oauth_token_secret']

をセットします.(未検証)

(修正 2009/8/20)


ついでにいうと,リファレンスのサンプルリクエストに間違いを発見

    https://auth.login.yahoo.co.jp/oauth/v2/get_token?oauth_consumer_key=dj0yJmk9UjI2WmVET25uRk9XJnM9Y29uc3VtZXJzZWNyZXQmeD1hZA--
    &oauth_nonce=ef3a091928d5491624c0ac54d697124422705091
    &oauth_signature_method=PLAINTEXT
    &oauth_signature=5f78507cf0acc38890cf5aa697210822e90c8b1c%261fa61b464613d0d32de80089fe099caf34c9dac5
    &oauth_timestamp=1228169662
    &oauth_verfier=svmhhd → &oauth_verifier=svmhhd ※ i が抜けてます
    &oauth_version=1.0
    &oauth_token=gugucz

Yahoo! Japan さんにはこれからもお世話になると思いますが,もう少しOAuthで扱えるAPIを増やして欲しい.個人的にはYahoo! ブックマークにアクセスできるAPIが欲しい.