Search on the blog

2012年7月14日土曜日

phpでOAuthしてみた

作ったもの
twitterで"ぽいぽい"しましょう。リンクをクリックすると、"ぽいぽい"できます。
http://goodpreparations.co.cc/test/twitter/sample1/auth.php

前準備
PEARライブラリのインストール
$ pear install Net_URL2-0.3.0
$ pear install HTTP_Request2-0.5.1
$ pear install HTTP_OAuth-0.1.6
php.iniの編集
CLI版はインクルードパスの設定していたけど、CGI版の方はやってなかったので追記。
(php.ini)
include_path = ".:PEARライブラリのパス"
そのあとサーバー再起動。
sudo apache2ctl stop
sudo apache2ctl start

ソースコード
<?php
require_once("HTTP/OAuth/Consumer.php");

// start a session
session_start();

// create a consumer object
$ini_array = parse_ini_file("/home/kenji/config/twitterapp.ini", true);
$consumer_key = $ini_array['test1']['key'];
$consumer_secret = $ini_array['test1']['secret'];
$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);

if ($_GET['oauth_verifier'] == "") {
    // get a request token
    $callback = 'http://goodpreparations.co.cc/test/twitter/sample1/auth.php';
    $consumer->getRequestToken('http://twitter.com/oauth/request_token', $callback);
    $_SESSION['request_token'] = $consumer->getToken();
    $_SESSION['request_secret'] = $consumer->getTokenSecret();
    
    // make an authorization page URL
    // $auth_url = $consumer->getAuthorizeUrl('http://twitter.com/oauth/authorize');
    $auth_url = $consumer->getAuthorizeUrl('http://twitter.com/oauth/authenticate');
    print "<a href=\"$auth_url\">Poi Poi on Twitter!</a>";
}
else {
    // get an access token
    $verifier = $_GET['oauth_verifier'];
    $consumer->setToken($_SESSION['request_token']);
    $consumer->setTokenSecret($_SESSION['request_secret']);
    $consumer->getAccessToken('http://twitter.com/oauth/access_token', $verifier);
    
    // tweet some mysterious message
    $status = 'ぽいぽいぽいぽぽいぽいぽぴーーー!! ' . date('jS F Y h:i:s A');;
    $response = $consumer->sendRequest("http://twitter.com/statuses/update.xml", array('status' => $status), "POST");
    print "See your <a href='https://twitter.com/' target='twitter'>twitter</a> page!<br />";
}
?>
ソースコード解説
  1. 2行目でOAuthを使うためのPEARのライブラリをインポート。
  2. 7-11行目で、 consumer keyとconsumer secretを指定してHTTP_OAuth_Consumer型のインスタンスを生成。consumer keyとconsumer secretはセキュリティを考慮して設定ファイルで指定。
  3. 13-24行目はverifierが空のとき、つまりユーザー認証がまだ行われていないときの処理。(ここの分岐もっとかっこよく書けないだろうか・・・)
  4. 15-18行目でrequest token、request secretを生成。getRequestToken()でproviderにHTTPリクエストを投げてこれらの値を取得している。
  5. 22行目でユーザーに踏ませるURLを生成する。GETパラメータでrequest tokenを指定。
  6. 25-36行目は、providerから戻ってきたときの処理。
  7. 30行目でaccess token、access secretを取得している($consumerのtoken、tokenSecretフィールドに格納される)。getAccessToken()の中を見れば分かるが、access token、access secretの取得にはconsumer key、consumer secret、request token、request secret、verifierが必要。
OAuthの概念図と照らし合わせてみると、なるほどーという感じ。仕組みはだいたい分かったけど、それぞれのトークンがprovider内部でどのように生成されるのかが分かっていないので時間があるとき調べてみよう。


参考ページ
PHPでTwitter APIのOAuthを使う方法まとめ - とても分かりやすかったです。

0 件のコメント:

コメントを投稿