【PHP】新TwitterOAuthでログイン機能を実装する

  • 206
    いいね
  • 15
    コメント

TwitterOAuth がいつの間にか新しくなっていたので、新しい使い方をメモしておこうと思います。

意外と簡単かもしれません。

TwitterOAuth をダウンロードする

https://twitteroauth.com/

kobito.1427101355.400999.png

まず、TwitterOAuth の Web ページから、TwitterOAuth をダウンロードします。Composer でのインストール方法がデフォルトで表示されていますが、「Mannual install」ボタンをクリックすると、TwitterOAuth のダウンロード方法が表示されます。

APIキーを発行する

https://apps.twitter.com/

kobito.1427103407.446539.png

API キーの取得方法については割愛。

ディレクトリ構成はこんな感じ

  • http://www.example.com/
    • common.php
    • login.php
    • callback.php
    • mypage.php
    • twitteroauth (上記URLからダウンロードしてきたファイル群)

Twitter API を弄るために必要な値を定義する

<?php

//common.php

define( 'CONSUMER_KEY', 'Twitterのコンシュマーキー(APIキー)' );
define( 'CONSUMER_SECRET', 'Twitterのコンシュマーシークレット(APIシークレット)' );
define( 'OAUTH_CALLBACK', 'http://www.example.com/callback.php' );

login.phpを作る

<?php

session_start();

require_once 'common.php';
require_once 'twitteroauth/autoload.php';

use Abraham\TwitterOAuth\TwitterOAuth;

//TwitterOAuth をインスタンス化
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);

//コールバックURLをここでセット
$request_token = $connection->oauth('oauth/request_token', array('oauth_callback' => OAUTH_CALLBACK));

//callback.phpで使うのでセッションに入れる
$_SESSION['oauth_token'] = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];

//Twitter.com 上の認証画面のURLを取得( この行についてはコメント欄も参照 )
$url = $connection->url('oauth/authenticate', array('oauth_token' => $request_token['oauth_token']));

//Twitter.com の認証画面へリダイレクト
header( 'location: '. $url );

callback.phpを作る

Twitterの認証画面からここにリダイレクトされます。この処理が終わったら、 mypage.php にリダイレクトされます。

<?php

session_start();

require_once 'common.php';
require_once 'twitteroauth/autoload.php';

use Abraham\TwitterOAuth\TwitterOAuth;

//login.phpでセットしたセッション
$request_token = [];  // [] は array() の短縮記法。詳しくは以下の「追々記」参照
$request_token['oauth_token'] = $_SESSION['oauth_token'];
$request_token['oauth_token_secret'] = $_SESSION['oauth_token_secret'];

//Twitterから返されたOAuthトークンと、あらかじめlogin.phpで入れておいたセッション上のものと一致するかをチェック
if (isset($_REQUEST['oauth_token']) && $request_token['oauth_token'] !== $_REQUEST['oauth_token']) {
    die( 'Error!' );
}

//OAuth トークンも用いて TwitterOAuth をインスタンス化
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $request_token['oauth_token'], $request_token['oauth_token_secret']);

//アプリでは、access_token(配列になっています)をうまく使って、Twitter上のアカウントを操作していきます
$_SESSION['access_token'] = $connection->oauth("oauth/access_token", array("oauth_verifier" => $_REQUEST['oauth_verifier']));
/*
ちなみに、この変数の中に、OAuthトークンとトークンシークレットが配列となって入っています。
*/

//セッションIDをリジェネレート
session_regenerate_id();

//マイページへリダイレクト
header( 'location: /mypage.php' );

追記(2015/03/26)

11行目が $request_token = [] となっていましたが、動かない場合がある、ということで調べてみたところ、この短縮記法は、PHP 5.4 以降で使える、とのことでした。( :point_right: http://php.net/manual/ja/language.types.array.php )

追々記(2015/03/27)

PHP 5.4 から、 array() の短縮記法である、 [] が使えます。

//以下の2行は、どちらも同じことをしている。
$hoge = array();
$hoge = [];

つまり、PHP 5.3 またはそれ以前を使っている場合、 [] は使えないということですが、 PHP 5.3 はすでにサポートが切れている ので、極力バージョンアップして、みんなで [] を使おう!ということです。(詳しくは、コメント欄参照)

@le_panda_noir さん、@mpyw さん、ありがとうございました!

mypage.phpを作る

ここで、ユーザー情報を表示します。

<?php

session_start();

require_once 'common.php';
require_once 'twitteroauth/autoload.php';

use Abraham\TwitterOAuth\TwitterOAuth;

//セッションに入れておいたさっきの配列
$access_token = $_SESSION['access_token'];

//OAuthトークンとシークレットも使って TwitterOAuth をインスタンス化
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);

//ユーザー情報をGET
$user = $connection->get("account/verify_credentials");
//(ここらへんは、Twitter の API ドキュメントをうまく使ってください)

//GETしたユーザー情報をvar_dump
var_dump( $user );


こうすると、 $user に、ユーザー情報が オブジェクトとして 格納されます。

実行結果の例:

object(stdClass)[7]
  public 'id' => int 1224353684
  public 'id_str' => string '1224353684' (length=10)
  public 'name' => string 'SofPyon' (length=38)
  public 'screen_name' => string 'sofpyon' (length=7)
  public 'location' => string 'Japan' (length=5)
  public 'profile_location' => null
  (以下、まだまだ続くので省略)

あとは、ユーザー情報を表示したい場所に、以下のように出力すればOK(念のため htmlspecialchars() などをかけた方が良い )

あなたの名前:
<?php echo $user->name; ?>

Twitter API のドキュメントはここ

https://dev.twitter.com/rest/public

(参考) $_SESSION['access_token'] について(2015-05-04追加)

配列。

  • oauth_token
  • oauth_token_secret
  • user_id - 数字のID
  • screen_name - これが、いわゆる Twitter ID
//例
array(4) {
  ["oauth_token"]=>
  string(50) "(OAuthトークン)"
  ["oauth_token_secret"]=>
  string(45) "(OAuthトークンシークレット)"
  ["user_id"]=>
  string(10) "1224353684"
  ["screen_name"]=>
  string(7) "sofpyon"
}

間違いや意見等ありましたら、ぜひコメントください。

このサンプルが動作しない場合も、コメントください!

参考文献