えびしブログ

〜サーバーは魔法で動いているわけではない〜

【PHP】TwitterのOAuth認証を使ったログイン

TwitterのOAuth認証をPHPで実装します。
ログアウト処理がうまくできてないのでご助言いただけるとありがたいです…!

ライブラリ

こちらのライブラリを使いました。
ほかのスクリプトと同じディレクトリに保存しました。

準備

ここでアプリケーションを登録します。
アプリケーションの種類はブラウザアプリケーション。
callbackURLにはlocalhostが指定できないので適当に登録します。

登録すると、Consumer keyとConsumer secretが得られます。
これを使って認証します。

Access token取得の流れ

  1. Consumer keyとConsumer secretを使ってRequest tokenとRequest secretを取得
    1. このとき、callbackURLを指定する
  2. Request tokenとRequest secretを使ってAuthorizeURL(Twitterの認証URL)を取得
  3. ユーザが認証ボタンを押す
  4. callbackURLにパラメータ(oauth_verifier)が付いて返ってくる(GET送信される)
  5. Consumer key、Consumer secret、Request token、Request secret、そしてoauth_verifierを使ってAccess tokenを取得

ややこしや!!

ソース

  • testoauth.php
<?php
session_start();
require_once("twitteroauth.php");// ライブラリの読み込み

// セッションにアクセストークンがなかったらloginページに飛ぶ
if($_SESSION['oauth_token']===NULL && $_SESSION['oauth_token_secret']===NULL){
	header("Location: login.php");
}

$user_id = $_SESSION['user_id'];
$screen_name = $_SESSION['screen_name'];
echo "<html><head><title>top</title></head><body>";
echo "<p>ようこそ!".$screen_name."さん</p>";
echo "<p>".$user_id."</p>";
echo "<p><a href=\"./logout.php\">ログアウト</a></p>"
?>
  • login.php
    • 本当はここにワンクッション置いたほうがいいかもしれません…
<?php
session_start();
require_once("twitteroauth.php");

// Consumer keyの値
$consumer_key = "自分で取得したもの";
// Consumer secretの値
$consumer_secret = "自分で取得したもの";

// OAuthオブジェクト生成
$to = new TwitterOAuth($consumer_key,$consumer_secret);
// callbackURLを指定してRequest tokenを取得
$tok = $to->getRequestToken("http://localhost/testtwitter/callback.php");
// セッションに保存
$_SESSION['request_token']=$token=$tok['oauth_token'];
$_SESSION['request_token_secret'] = $tok['oauth_token_secret'];
// AuthorizeURLを取得
$url = $to->getAuthorizeURL($token);
echo "<html><head><title>login</title></head><body><a href=\"".$url."\">ログイン</a></body></html>";
?>
<?php
session_start();
require_once("twitteroauth.php");
// Consumer keyの値
$consumer_key = "自分で取得したもの";
// Consumer secretの値
$consumer_secret = "自分で取得したもの";

// パラメータからoauth_verifierを取得
$verifier = $_GET['oauth_verifier'];

// Consumer key,Consumer secret, Request token, Request secretを使ってOAuthオブジェクト生成
$to = new TwitterOAuth($consumer_key,$consumer_secret,$_SESSION['request_token'],$_SESSION['request_token_secret']);
// oauth_verifierを使ってAccess tokenを取得
$access_token = $to->getAccessToken($verifier);

// token keyとtoken secret, user_id, screen_nameをセッションに保存
$_SESSION['oauth_token'] = $access_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $access_token['oauth_token_secret'];
$_SESSION['user_id'] = $access_token['user_id'];
$_SESSION['screen_name'] = $access_token['screen_name'];

// TOPページへ
header("Location: testoauth.php");
?>

うまくいかなかったところ

ログアウトがうまくいきませんでした。
ログアウトして、再びログインを押すとTwitterの認証画面に飛んでほしいのですが、普通にTOPページへ飛んでしまいます。

  • logout.php
    • セッションを破棄するだけでは、再びTwitterの認証画面に行くことはできませんでした…。
<?php
session_start();
session_destroy();
header("Location: login.php");
?>