LaravelでTwitter認証を実装する

#はじめに
シンプルなフォームベースの認証以外やったことがなかったので、Twitter認証を今回実装してみました。
実装の一連の手順をまとめましたので、参考になれば幸いです。

#環境構築
こちらの記事を参考にしてLaravel環境を構築しました。
[【超入門】20分でLaravel開発環境を爆速構築するDockerハンズオン](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)

Laravelのバージョン：8.10.0

#ログイン画面作成
こちらの記事を参考にしました
[Laravel8 (laravel/ui)でのLogin機能の実装方法〜MyMemo](https://qiita.com/daisu_yamazaki/items/b946594896179abcd203)

#Twitter認証
Socialiteを使って認証機能を実装していきます

##TwitterAPIの利用申請
まずは、Twitter APIの取得が必要になるので、Twitterの開発者ページから申請・APIトークン取得を行います。
取得方法はこちらの記事を参考にしました
[すこしだけTwitterAPIの利用申請が楽になった件(2020年8月現在)](https://cpoint-lab.co.jp/article/202008/16615/)

##Socialiteの設定
認証で必要なSocialiteというライブラリーをインストールします。

```
composer require laravel/socialite
```
ちなみにSocialiteが対応しているサービスはTwitter以外に下記も対応。

* Google
* Facebook
* Linkedin
* Github
* Gitlab
* Bitbucket

インストールが終わったら、`config/app.php`にprovideとaliasの設定をします。

```php:config/app.php
'providers' => [ 
    Laravel\Socialite\SocialiteServiceProvider::class,
],
'aliases' => [
    'Socialite' => Laravel\Socialite\Facades\Socialite::class,
]
```

次にTwitter認証情報を`config/service.php`に設定します。

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

.envファイルにTwitter利用申請で取得した情報を設定します。

```:.env
TWITTER_CLIENT_ID=TwitterのApi Key
TWITTER_CLIENT_SECRET=TwitterのAPI Secret Key
CALLBACK_URL=コールバックURL
```

##ルーティングの変更
`routes/web.php`にTwitterログインURL、TwitterコールバックURL、TwitterログアウトURLを追加します。

```php:routes/web.php
// TwitterログインURL
Route::get('auth/twitter', 'Auth\TwitterController@redirectToProvider');
// TwitterコールバックURL
Route::get('auth/twitter/callback', 'Auth\TwitterController@handleProviderCallback');
// TwitterログアウトURL
Route::get('auth/twitter/logout', 'Auth\TwitterController@logout');
```

##コントローラーの作成

```
php artisan make:controller Auth/TwitterController 
```

```php:TwitterController
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

use Socialite;

class TwitterController extends Controller
{
    // Twitterログイン
    public function redirectToProvider(){
        return Socialite::driver('twitter')->redirect();
    }

    // Twitterコールバック
    public function handleProviderCallback() {
        try {
            // ユーザー詳細情報の取得
            $user = Socialite::driver('twitter')->user();
        } catch (Exception $e) {
            return redirect('auth/twitter');
        }
        return redirect('/');

    }

    //　Twitterログアウト
    public function logout(Request $request) {
        Auth::logout();
        return redirect('/');
    }
}
```

##Bladeの編集
ログイン、ログアウト部分のURLを変更します。

```
<a href="/auth/twitter">ログイン</a>
<a href="/auth/twitter/logout">ログアウト</a>
```

#参考
・[【超入門】20分でLaravel開発環境を爆速構築するDockerハンズオン](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)
・[Laravel8 (laravel/ui)でのLogin機能の実装方法〜MyMemo](https://qiita.com/daisu_yamazaki/items/b946594896179abcd203)
・[すこしだけTwitterAPIの利用申請が楽になった件(2020年8月現在)](https://cpoint-lab.co.jp/article/202008/16615/)
・[LaravelでTwitterログインを実装する](https://qiita.com/tiwu_dev/items/8ac86977344a1a97f9d2)