bussorenre Laboratory

hoge piyo foo bar

PEARでSign in with Twitterを実装する

どうもこんばんは。何番煎じかわかりませんが自分用のメモとしてPEARを使ってのTwitter のOauth 認証の作り方を書きます。最近、Cacooとか読書メーターとか、Sign in with Twitter とかいうログインボタンありますよね。あーいうのを作ります。

PEARのインストールとかは前の記事でやっているので、そちらをご覧ください。

さて、まずTwitter のdeveloper 登録をします。https://dev.twitter.com/ に自分のTwitter アカウントでログインしてください。すると、右下にCreate an App という文字があると思うので、それをクリック(Twitter developers は全部英語で書かれているので、ちょっと混乱するかもですが、気合で乗り切りましょう)

すると、アプリケーションの登録フォームが出てくるので、サクっと除法を入力

Name
アプリケーションの名前。〜〜から投稿 という風にクライアント名が表示される。
Description
アプリの説明。特に何を書いても問題なし。
WebSite
何でもOK。私は自分のブログ(これ)を指定してますが。「〜〜から投稿」というのをクリックすると、ここで指定されたアドレスにリンクされる。
Callback URL
地味に重要。ログイン処理を行うアプリのURLを記載する。

はい。登録はこれだけ。あとは規約を読んで同意し、英字か何かを入力して次へ。
すると、My Application Details みたいな画面が出てくるので、そこで「Consumer key」と「Consumer secret」を確認する。この鍵を用いて、Twitterへのログイン処理をする。

ここまでできたら、あとはコードをガリガリ書くだけ。
私はとりあえず、こんな感じで描いてみた。

// ライブラリのロード
require_once("Services/Twitter.php");
require_once("HTTP/OAuth/Consumer.php");

// OAuth関連。
define('TWITTER_CONSUMER_KEY',		'※先程取得した※consumer_key');
define('TWITTER_CONSUMER_SECRET',	'※先程取得した※consumer_key_secret');

// ログイン関連のURL情報
define('TWITTER_REQUEST_TOKEN',		'http://api.twitter.com/oauth/request_token');
define('TWITTER_ACCESS_TOKEN',		'http://api.twitter.com/oauth/access_token');
define('TWITTER_AUTHORIZE',			'http://twitter.com/oauth/authenticate');
define('TWITTER_CALLBACK',			'先程指定したCallback URL');

/* 
 * Sign in with Twitter ボタンをその場に生成する。
 * @param $consumer OAuth認証用に作成したHTTP_OAuth_Consumerインスタンス
 */
function signinwithTwitter($consumer)
{
	// リクエストトークンの取得
	$consumer->getRequestToken(TWITTER_REQUEST_TOKEN, TWITTER_CALLBACK);
	
	// トークンをセッションに保存(この部分必要あるか…??→クロスサイトスクリプティング対策に必要)
	$_SESSION['twitter_request_token'] = $consumer->getToken();
	$_SESSION['twitter_request_token_secret'] = $consumer->getTokenSecret();
	$auth_url = $consumer->getAuthorizeURL(TWITTER_AUTHORIZE);
	print('<a href="'.$auth_url.'"><img src="http://si0.twimg.com/images/dev/buttons/sign-in-with-twitter-d.png" /></a>');
}

/*
 * Twitterでのログイン認証を実現する.
 */
function login_Twitter()
{
	// OAuth に必要なインスタンスの作成
	$oauth = new HTTP_OAuth_Consumer(TWITTER_CONSUMER_KEY,TWITTER_CONSUMER_SECRET);
	$oauth_flag = false;

	// セッションを開始する。
	session_start();
	if(empty($_SESSION['twitter_access_token']) && empty($_GET['oauth_verifier']))
	{
		// 初回ログイン時
		// sign in with Twitter のアイコンを表示
		signinwithTwitter($oauth);
	}
	else if(isset($_GET['oauth_verifier']))
	{
		// Twitter からCALLBACKを呼ばれて帰ってきた時。
		// Oauthにリクエストトークンをセットする
		try {
			$oauth->setToken( $_SESSION['twitter_request_token']);
			$oauth->setTokenSecret( $_SESSION['twitter_request_token_secret']);
		
			// アクセストークンを取得(これが大事)
			$oauth->getAccessToken(TWITTER_ACCESS_TOKEN, $_GET['oauth_verifier']);
			$_SESSION['twitter_access_token'] = $oauth->getToken();
			$_SESSION['twitter_access_token_secret'] = $oauth->getTokenSecret();
		} catch (Exception $e){
			// エラーです。
		}
		// これでログインされました
	}
	else 
	{
		// ログインされてるはず
	}
}
/*
 * Twitter からログアウトする。それ以上でもそれ以下でも無いです
 */
function logout_Twitter()
{
	unset($_SESSION['twitter_access_token']);
	unset($_SESSION['twitter_access_token_secret']);
}
// テスト------------------------------------------------------
login_Twitter();

はい。これで動きました。
もしかしたら、リクエストトークンの発行と、アクセストークンの取得は別ファイルにする人が多いかもしれない…