前回の記事に引き続き、TwitterでOAuth認証をcodebird.phpを使用して作ってみました。
4つのファイルを使用して多少冗長ではありますが、ログイン、ログアウトできます。
どのファイルにアクセスしてもログインしてなければ、”unlogin.php”に飛ぶようにしてあります。

ファイル名:unlogin.php

<?php
session_start();
session_regenerate_id(TRUE);
require_once('codebird.php');
Codebird::setConsumerKey('TwitterカスタマーID', 'Twitterカスタマーシークレット');
$callback_url = '/***/callback.php'; // コールバックするURLを指定
$server_host = $_SERVER['HTTP_HOST'];

// アクセストークンのチェック

if (isset($_SESSION['oauth_token']) && $_SESSION['oauth_token'] !== NULL && isset($_SESSION['oauth_token_secret']) && $_SESSION['oauth_token_secret'] !== NULL) {
	header('Location: ./');
	return;
} else {
	// gets a request token
	$cb = Codebird::getInstance();

	$reply = $cb->oauth_requestToken(array(
			'oauth_callback' => 'http://' . $server_host . $callback_url
	));

	// stores it
	$cb->setToken($reply->oauth_token, $reply->oauth_token_secret);
	$_SESSION['request_token'] = $reply->oauth_token;
	$_SESSION['request_token_secret'] = $reply->oauth_token_secret;

	// gets the access token
	$cb->setToken($reply->oauth_token, $reply->oauth_token_secret);
	$auth_url = $cb->oauth_authorize();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Twitterログインテスト</title>
</head>
<body>
ログインしていません。<br/>
ログインしますか?<br/><br/>
<?php echo '<a href="' . $auth_url . '">Twitterでログイン</a>'; ?>
</body>
</html>

ファイル名:callback.php

<?php
session_start();
session_regenerate_id(TRUE);
require_once('codebird.php');
Codebird::setConsumerKey('TwitterカスタマーID', 'Twitterカスタマーシークレット');

$cb = Codebird::getInstance();
//URLパラメータからoauth_verifierを取得
if (isset($_GET['oauth_verifier']) && $_GET['oauth_verifier'] != '') {
	$sVerifier = $_GET['oauth_verifier'];
} else {
	// echo 'oauth_verifier error!';
	session_destroy();
	$_SESSION[''] = array();
	unset($_GET['oauth_verifier']);
	header("Location: ./unlogin.php");
	die();
}

//リクエストトークンでOAuthオブジェクトの生成
$cb->setToken($_SESSION['request_token'], $_SESSION['request_token_secret']);
$reply = $cb->oauth_accessToken(array(
		'oauth_verifier' => $_GET['oauth_verifier']
));
try {
	if (!isset($reply)) {
		throw new Exception("replyがありません");
	}
	if (isset($reply->httpstatus) && $reply->httpstatus == 200) {
		$_SESSION['oauth_token'] = 			$reply->oauth_token;
		$_SESSION['oauth_token_secret'] = 	$reply->oauth_token_secret;
		$_SESSION['user_id'] = 				$reply->user_id;
		$_SESSION['screen_name'] = 			$reply->screen_name;
	} elseif ($reply->httpstatus == 401) {
		throw new Exception("httpstatus:401エラーです");
	}
	//loginページへリダイレクト
	header("Location: unlogin.php");
	die();
}catch(Exception $e) {
	echo $e;  //debug
	die(); // debug
	session_destroy();
	$_SESSION[''] = array();
	unset($_GET['oauth_verifier']);
	header("Location: ./unlogin.php");
	die();
}

ファイル名:index.php

<?php
session_start();
session_regenerate_id(TRUE);
require_once('codebird.php');
Codebird::setConsumerKey('TwitterカスタマーID', 'Twitterカスタマーシークレット');
$cb = Codebird::getInstance();
// アクセストークンのチェック
if (isset($_SESSION['oauth_token']) && $_SESSION['oauth_token'] !== NULL && isset($_SESSION['oauth_token_secret']) && $_SESSION['oauth_token_secret'] !== NULL) {
	// 認証完了
		$user_id = $_SESSION['user_id'];
		$screen_name = $_SESSION['screen_name'];
		$cb->setToken($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
		$reply = $cb->users_show(array('user_id'=>$user_id));
	if ($user_id != $reply->id) {
			header('Location: ./logout.php');
			return;
	}
} else {
	header('Location: ./logout.php');
	return;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
<link rel="stylesheet" type="text/css" href="style.css" />
<title>Twitterログインテスト</title>
</head>
<body>
<h1>デモンストレーション</h1><br/>
ようこそ<strong><?php echo $reply->name; ?>さん</strong> ログインに成功しました。<br/><br/>
<a href="logout.php">ログアウトする</a><br/>

</body>
</html>

ファイル名:logout.php

<?php
session_start();
session_regenerate_id(TRUE);
session_destroy();
$_SESSION = NULL;
unset($_GET['oauth_verifier']);
header("Location: ./unlogin.php");
?>

なお、このファイルをここに設置しました。http://garagekoh.xii.jp/feed/
注)Twitterのアカウントが必要です。