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

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

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

#TwitterOAuth をダウンロードする
https://twitteroauth.com/

![kobito.1427101355.400999.png](https://qiita-image-store.s3.amazonaws.com/0/43456/357e7761-343c-5777-f1c7-e77512c92bde.png "kobito.1427101355.400999.png")

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

#APIキーを発行する
https://apps.twitter.com/

![kobito.1427103407.446539.png](https://qiita-image-store.s3.amazonaws.com/0/43456/c509374d-a6dc-3afe-e152-1abaa4ef9fea.png "kobito.1427103407.446539.png")

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

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

* *http://www.example.com/*
 * __common.php__
 * __login.php__
 * __callback.php__
 * __mypage.php__
 * __twitteroauth__ (上記URLからダウンロードしてきたファイル群)

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

```php
<?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
<?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
<?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()` の短縮記法である、 `[]` が使えます。

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

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

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

#mypage.phpを作る
ここで、ユーザー情報を表示します。

```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` に、ユーザー情報が **オブジェクトとして** 格納されます。

実行結果の例：

```php
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
あなたの名前：
<?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

```php
//例
array(4) {
  ["oauth_token"]=>
  string(50) "(OAuthトークン)"
  ["oauth_token_secret"]=>
  string(45) "(OAuthトークンシークレット)"
  ["user_id"]=>
  string(10) "1224353684"
  ["screen_name"]=>
  string(7) "sofpyon"
}
```

---

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

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

#参考文献
 * **Sign in with Twitter - TwitterOAuth**
  * https://twitteroauth.com/redirect.php