LaravelのSocialiteを利用してTwitterソーシャルログイン実装

#Socialiteとは？
今までCakePHP2を使用してきた<a href="http://twitter.com/solt9029">@solt9029</a>です。
Laravelは物凄く使いやすくて感動しています。
PHPのフレームワークであるLaravelにおける超便利なソーシャルログイン用のライブラリ的なものです。
どのくらい簡単かというとTOEICで250点を獲得するくらい簡単です。
本記事ではSocialiteを使用してTwitterログインを実装します。
その際、あらかじめVagrantとVirtualBoxをインストールし、homesteadというLaravelの提供する仮想環境を構築した状態を想定しています。
以下の公式のチュートリアルが参考になります。
【Laravel 5.1 Laravel Homestead】 https://readouble.com/laravel/5.1/ja/homestead.html

#使用するバージョン
- Laravel 5.1.*
- Socialite 2.0.9

#Socialiteを入れる
まずはSocialiteをLaravelに入れます。

```
composer require laravel/socialite:2.0.9
```

続いて、config/app.phpを開いてproviders配列に以下を追加します。

```php:app.php
Laravel\Socialite\SocialiteServiceProvider::class,
```

同様に、config/app.phpの中のaliases配列に以下を追加します。

```php:app.php
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
```

これで下準備完了です！

#Twitterアプリ登録

Twitterのアプリ登録をしてください。
その際に、callbackURLは「　（自分の設定したホスト名）/auth/twitter/callback　」としてください。
ここではsocialite-tutorial.appとしています。
確かlocalhostは利用できませんのでご注意ください。
ConsumerKeyとConsumerSecretを使用します。

#定数の設定
.envファイルに以下を足してください。

```
TWITTER_CLIENT_ID=(あなたのconsumerkey)
TWITTER_CLIENT_SECRET=(あなたのconsumersecret)
CALLBACK_URL=http://socialite-tutorial.app/auth/twitter/callback
```

config/services.phpを開いて配列に以下の項目を足してください。

```php:services.php
"twitter"=>[
    "client_id"=>env("TWITTER_CLIENT_ID"),
    "client_secret"=>env("TWITTER_CLIENT_SECRET"),
    "redirect"=>env("CALLBACK_URL"),
]
```

#ルーティング
app/Http/routes.phpに以下の設定をします。

```php:routes.php
Route::get('/', function () {
    return view('welcome');
});

Route::get('auth/twitter', 'Auth\AuthController@redirectToProvider');
Route::get('auth/twitter/callback', 'Auth\AuthController@handleProviderCallback');
Route::get("auth/twitter/logout","Auth\AuthController@getLogout");

Route::get("home",array("as"=>"home","uses"=>function(){
	return view("home");
}));
```

#マスアサインメントの設定
app/User.phpの$fillableを変更します。
Userモデルがデフォルトであるのが素晴らしいですね。

```php:User.php
protected $fillable=["name","nickname","twitter_id","avatar"];
```

#AuthControllerの設定
app/Http/Controllers/Auth/AuthController.phpを開いてnamespaceの利用を付け足します。

```php:AuthController.php
use Auth;
use Socialite;
```

またAuthControllerに以下のプロパティとアクションを付け足します。

```php:AuthController.php
    protected $redirectPath = '/home';

    public function redirectToProvider(){
        return Socialite::driver('twitter')->redirect();
    }
 
    public function handleProviderCallback(){
        try {
            $user = Socialite::driver('twitter')->user();
        } catch (Exception $e) {
            return redirect('auth/twitter');
        }
        $authUser = $this->findOrCreateUser($user);
        Auth::login($authUser, true);
        return redirect()->route('home');
    }

    private function findOrCreateUser($twitterUser){
        $authUser = User::where('twitter_id', $twitterUser->id)->first();
        if ($authUser){
            return $authUser;
        }
        return User::create([
            'name' => $twitterUser->name,
            'nickname' => $twitterUser->nickname,
            'twitter_id' => $twitterUser->id,
            'avatar' => $twitterUser->avatar_original
        ]);
    }
```

#マイグレーションの設定
まだマイグレートしてないと思うので、もともとあるapp/database/migrations/create_user_table.phpをいじっちゃいます。

```create_user_table.php
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('nickname');
        $table->string("twitter_id")->unique();
        $table->string("avatar");
        $table->rememberToken();
        $table->timestamps();
    });
}
```

#テンプレートファイルの編集
てきとーにログイン用のリンクを張っておくといいかなと思います。
resources/views/welcome.blade.phpのどこかに付け足してください。

```html:welcome.blade.php
<a href="auth/twitter">twitter login</a>
```

またログイン後のページも作っちゃいましょう。
resources/views/home.blade.phpという感じでファイルを作ってください。

```html:home.blade.php
<html>
    <head>
        <title>Laravel</title>
    </head>
    <body>
        <h4>your name is {{ Auth::user()->name }}</h4>
        <h4>your twitter nickname is {{ Auth::user()->nickname }}</h4>
        <div><img src="{{ Auth::user()->avatar }}" height="200" width="200"></div>
        <a href="auth/twitter/logout">twitter logout</a>
    </body>
</html>
```

#マイグレーション実行
以下のコマンドでマイグレーションを行います。
既にマイグレーション済みとかだったらrollbackしてください。

```
php artisan migrate
```

これで http://socialite-tutorial.app から試してみてください！！

#おわりに
CakePHP2で実装していたらなかなかだるかったのですが、Laravelだとすぐ出来てしまいました。
素晴らしい…。