PHPでTwitterのOAuthを試してみる
CentOSにPHPのとりあえずの開発環境を作成してみる
の続き
【参考】 Twitter OAuth + PHP でログイン処理の実装 http://temog.info/archives/programming/twitter-oauth-php-login.html [PHP] ライブラリを使わず Twitter API での OAuth 認証とユーザータイムラインの取得 | unlinked log http://log.noiretaya.com/246 リクエストトークンを取得する [oauth/request_token] - Twitter APIの使い方まとめ http://apitip.com/twitter/27 アクセストークンを取得する [oauth/access_token] - Twitter APIの使い方まとめ http://apitip.com/twitter/28
※VirtualBoxのマシンのIPアドレスは「192.168.56.101」になってます。
アプリケーションの登録
下記のページにアクセスして、アプリケーションを作成する。
https://apps.twitter.com/
サンプルプログラムの作成
util.php
<?php /* * 署名の作成 */ function build_signature($method, $url, $params, $consumer_secret, $token_secret = '') { ksort($params); $base = rawurlencode($method)."&".rawurlencode($url)."&".rawurlencode(http_build_query($params)); $key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret); return base64_encode(hash_hmac('sha1', $base, $key, true)); }
index.php
<?php require('util.php'); // アプリケーション設定 define('CONSUMER_KEY', '(控えておいたAPI Keyを設定する)'); define('CONSUMER_SECRET', '(控えておいたAPI secretを設定する)'); define('CALLBACK_URL', 'http://192.168.56.101/callback.php'); // URL define('RTOKEN_URL', 'https://api.twitter.com/oauth/request_token'); define('AUTH_URL', 'https://api.twitter.com/oauth/authenticate'); //-------------------------------------- // リクエストトークンの取得 //-------------------------------------- $params = array( "oauth_callback" => CALLBACK_URL, "oauth_consumer_key" => CONSUMER_KEY, "oauth_nonce" => md5(microtime() . mt_rand()), "oauth_timestamp" => time(), "oauth_version" => "1.0", "oauth_signature_method" => "HMAC-SHA1", ); // 署名作成 $params['oauth_signature'] = build_signature('GET', RTOKEN_URL, $params, CONSUMER_SECRET); // GET送信 $res = file_get_contents(RTOKEN_URL . '?' . http_build_query($params)); // レスポンス取得 parse_str($res, $token); if(!isset($token['oauth_token'])){ echo "エラー発生"; exit; } $request_token = $token['oauth_token']; //-------------------------------------- // 認証ページにリダイレクト //-------------------------------------- $params = array( 'oauth_token' => $request_token, ); // リダイレクト header("Location: " . AUTH_URL . '?' . http_build_query($params));
callback.php
<?php require('util.php'); // アプリケーション設定 define('CONSUMER_KEY', '(控えておいたAPI Keyを設定する)'); define('CONSUMER_SECRET', '(控えておいたAPI secretを設定する)'); // URL define('TOKEN_URL', 'https://api.twitter.com/oauth/access_token'); define('INFO_URL', 'https://api.twitter.com/1.1/account/settings.json'); //-------------------------------------- // アクセストークンの取得 //-------------------------------------- $params = array( "oauth_consumer_key" => CONSUMER_KEY, "oauth_nonce" => md5(microtime() . mt_rand()), "oauth_timestamp" => time(), "oauth_verifier" => $_GET['oauth_verifier'], "oauth_version" => "1.0", "oauth_signature_method" => "HMAC-SHA1", "oauth_token" => $_GET['oauth_token'], ); // 署名作成 $params['oauth_signature'] = build_signature('POST', TOKEN_URL, $params, CONSUMER_SECRET); // POST送信 $options = array('http' => array( 'method' => 'POST', 'content' => http_build_query($params) )); $res = file_get_contents(TOKEN_URL, false, stream_context_create($options)); // レスポンス取得 parse_str($res, $token); $access_token = $token['oauth_token']; $access_token_secret = $token['oauth_token_secret']; //-------------------------------------- // ユーザーの設定情報を取得してみる //-------------------------------------- $params = array( "oauth_consumer_key" => CONSUMER_KEY, "oauth_nonce" => md5(microtime() . mt_rand()), "oauth_timestamp" => time(), "oauth_verifier" => $_GET['oauth_verifier'], "oauth_version" => "1.0", "oauth_signature_method" => "HMAC-SHA1", "oauth_token" => $access_token, ); // GET送信 $params['oauth_signature'] = build_signature('GET', INFO_URL, $params, CONSUMER_SECRET, $access_token_secret); $res = file_get_contents(INFO_URL . '?' . http_build_query($params)); // 表示 echo "<pre>" . print_r(json_decode($res, true), true) . "</pre>";
サンプルプログラムの確認
http://192.168.56.101/
にアクセスすると、下記の画面が表示される。
[連携アプリを認証]をクリックすると、
http://192.168.56.101/callback.php
が呼ばれ、ユーザーの設定情報が表示される。
TwitterOAuthのライブラリを使う場合
下記のサイトからライブラリをダウンロードし、
abraham/twitteroauth https://github.com/abraham/twitteroauth/
twitteroauthのディレクトリを、index.phpやcallback.phpを同じ所に置く。
twitteroauth/ ├ OAuth.php └ twitteroauth.php index.php callback.php
あとは、下記のような感じでプログラムを書けば同じように動作する。
index.php
<?php require_once('twitteroauth/twitteroauth.php'); // アプリケーション設定 define('CONSUMER_KEY', '(控えておいたAPI Keyを設定する)'); define('CONSUMER_SECRET', '(控えておいたAPI secretを設定する)'); define('CALLBACK_URL', 'http://192.168.56.101/callback.php'); //-------------------------------------- // リクエストトークンの取得 //-------------------------------------- $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET); $token = $twitter->getRequestToken(CALLBACK_URL); if(!isset($token['oauth_token'])){ echo "エラー発生"; exit; } $request_token = $token['oauth_token']; // セッションに保存(callback.phpでoauth_token_secretが必要になるので) session_start(); $_SESSION['oauth_token_secret'] = $token['oauth_token_secret']; //-------------------------------------- // 認証ページにリダイレクト //-------------------------------------- $auth_url = $twitter->getAuthorizeURL($request_token); header("Location: " . $auth_url);
callback.php
<?php require_once('twitteroauth/twitteroauth.php'); // アプリケーション設定 define('CONSUMER_KEY', '(控えておいたAPI Keyを設定する)'); define('CONSUMER_SECRET', '(控えておいたAPI secretを設定する)'); //-------------------------------------- // アクセストークンの取得 //-------------------------------------- // セッションから取得 session_start(); $request_token_secret = $_SESSION['oauth_token_secret']; // アクセストークンをリクエスト $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_GET['oauth_token'], $request_token_secret); $token = $twitter->getAccessToken($_GET['oauth_verifier']); //-------------------------------------- // ユーザーの設定情報を取得してみる //-------------------------------------- $settings = $twitter->get('account/settings'); echo "<pre>" . print_r($settings, true) . "</pre>";