PHPでTwitterのOAuthを試してみる

CentOSにPHPのとりあえずの開発環境を作成してみる
の続き

PHPTwitterのOAuthを試してみる。

【参考】
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/

アプリケーション名やURLを設定する。

[API Keys]のタブを選択し、「API Key」と「API secret」を控えておく。

サンプルプログラムの作成

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>";