Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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"
}

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

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

参考文献

sofpyon
いろいろやる大学生。21 卒業予定
https://soji.dev
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした