Twitter OAuth + PHP でログイン処理の実装


会員制サイト作るときにTwitterのアカウントでログインできるようにするアレです。
激しく今更感がありますが、いろんなサイト見ても、いまいちわかりづらかったのでメモ用にまとめます。

イメージ

Twitter API 使うための登録

こちらから登録。他サイトで散々既出なため省略します。
取得した「ConsumerKey」「ConsumerSecret」の文字列をメモります。

login page を作る

図の一番上のログイン用ページを作ります。よくある作りならログインページが出る == session が切れてるはずなので、自前ログイン、Twitterアカウントからログイン、Facebookアカウントでログイン、Googleアカウントでログインみたいなページになると思います。

この3種(Twitter, Facebook, Google)のWebサービスでログインできるように実装してしまえば自前ログインはいらないかもしれませんね。

最低限、getToken.php へのリンクがあればOKです。

getToken.php を作る

ガリガリ書き始める前に、OAuth用ライブラリの twitteroauth をダウンロードして使えるようにします。リンク先から zip or tar.gz をダウンロードしたら展開して twitteroauth/OAuth.phptwitteroauth/twitteroauth.php を同じディレクトリに配置してください。必要なのはこの2ファイルのみです。

今回は、わかりやすさ重視で「すべてのファイルが同じディレクトリに存在する」前提とします。

getToken.php

<?php
session_start();
require_once('twitteroauth.php');

// api 登録して取得した文字列を入れます
define('CONSUMER_KEY', 'xxxxx');
define('CONSUMER_SECRET', 'xxxxxxxxxxxxxxxxxxx');
define('CALLBACK_URL', 'http://example.com/callback.php');

// request token取得
$tw = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);

$token = $tw->getRequestToken(CALLBACK_URL);
if(! isset($token['oauth_token'])){
	echo "error: getRequestToken\n";
	exit;
}

// callback.php で使うので session に突っ込む
$_SESSION['oauth_token']        = $token['oauth_token'];
$_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];

// 認証用URL取得してredirect
$authURL = $tw->getAuthorizeURL($_SESSION['oauth_token']);
header("Location: " . $authURL);

コードの説明

2行目: 後ほど取得する request token を保存するために session 使うので session_start()
3行目: ダウンロードしたライブラリの twitteroauth.php を require。OAuth.php は、twitteroauth.php で読み込まれます。

6〜7行目: ConsumerKey, ConsumerSecret を設定。
8行目: Twitterの認証画面から自分のアプリへ戻ってくるURLを指定します。
24行目: request token を使ってTwitter認証画面へのURLを取得
25行目: 取得したTwitter認証画面URLへRedirect

getToken.php へアクセスすると初回は、Twitter認証画面へ飛ばされて、認証済み+2回目以降ならTwitter認証画面から直接Redirectされて callback に指定したURLへ飛ばされるようになります。

callback.php を作る

Twitter認証画面からの遷移先、callback.php を作ります。getToken.php と同じディレクトリ内に置くことを前提。
callback.php

<?php
session_start();
require_once('twitteroauth.php');

define('CONSUMER_KEY', 'xxxxx');
define('CONSUMER_SECRET', 'xxxxxxxxxxxxxxxxxxxxxx');

// getToken.php でセットした oauth_token と一致するかチェック
if ($_SESSION['oauth_token'] !== $_REQUEST['oauth_token']) {
	unset($_SESSION);
	echo '<a href="getToken.php">token不一致。最初からどうぞ</a>';
	exit;
}

// access token 取得
$tw = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET,
	$_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
$access_token = $tw->getAccessToken($_REQUEST['oauth_verifier']);

// Twitter の user_id + screen_name(表示名)
$user_id     = $access_token['user_id'];
$screen_name = $access_token['screen_name'];

// 初回ユーザかチェックするロジック
if( ){

	// 初回ユーザならDatabaseへの登録処理・・・などなど

}

// ログイン後の画面へ遷移

コードの説明

2行目: getToken.php でセットした session を利用するので session_start() します。
3行目: twitteroauth.php を require
5〜6行目: ConsumerKey、ConsumerSecretのセット
9〜13行目: 念の為、getToken.php でセットした oauth_token と一致しているかチェック
16〜18行目: access_token を取得します。中身はこんな感じになってます↓
Array
(
    [oauth_token] => xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    [oauth_token_secret] => xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    [user_id] => 999999999
    [screen_name] => temo_g
)
なお、ログインだけなら user_id さえわかれば困りませんが、自分のアプリで「Tweetする」とか「タイムラインを表示する」とかTwitterAPIをさらに利用するなら oauth_token, oauth_token_secret が必要になるので保存しときましょう。

21行目: access_token から TwitterのユーザIDを変数にセット。
22行目: screen_name を変数にセット。ログインするだけなら特に使いませんが、「ようこそ○○さん」みたいな使い方が一般的でしょうか。

25〜29行目: 自分のアプリに初めてログインするユーザなのかチェック。初ログインならユーザ登録処理へ。$user_id を保存しておけば初ログインか2回目以降なのかチェックできそうですね。

31行目: 書いてませんがログイン後の画面へ遷移させたり。

以上です。次のネタとしてFacebook、Googleでログイン処理ってのも書く予定。

Tag  

7 Responses to Twitter OAuth + PHP でログイン処理の実装

  1. 匿名 より:

    unset($_SESSION);
    これ使ったらスーパーグローバルにSESSION置けなくなる
    つまり
    次unsetした後でTwitterに渡る前にSESSION使用しても
    callback.phpでSESSIONを使用できなくなる

  2. […] 参考サイト:Twitter OAuth + PHP でログイン処理の実装 […]

  3. […] Twitter OAuth + PHP でログイン処理の実装. […]

  4. […] Twitter OAuth + PHP でログイン処理の実装 […]

コメントを残す

メールアドレスが公開されることはありません。

Top