Laravel8 ユーザ認証時にメールアドレス確認の処理を付与する

# 目的

- LaravelのAuth認証ではメールアドレスはただ入力するだけで、入力されたメールアドレスが正しい物であるかどうかの確認がない
- 入力メールアドレス宛にメールを送信し、初回のログインはメール内のURLからのみ行える様にする

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2GHzクアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHPバージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravelバージョン | 8.1.0 | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 前提条件

- 前述した実施環境に準ずる環境が整っていること。
- Laravelアプリが作成され、アプリの起動、ブラウザからの確認ができる状態になっていること。
- Authを用いたユーザ認証機能がすでに付与されていること。

# 前提情報

- 筆者は新規でLaravel8のアプリを作成して本検証を実施する。

# 読後感

- LaravelのAuth認証にメールアドレスの確認処理を付与することができる。
- ユーザ認証情報入力→メール受信→メール内のURLから初回ログインをしてもらう。

# 概要

1. .envの修正
1. モデルファイルの修正
1. ルーティング情報の修正
1. コントローラファイルの修正
1. 確認

# 詳細

1. .envの修正
    1. アプリ名ディレクトリで下記コマンドを実行して.envファイルを開く。

        ```terminal
        $ vi .env
        ```
    1. MAIL_MAILERの設定を下記の様に修正する。メール送信は行われず、情報がLaravelのログに出力される。

        ```アプリ名ディレクトリ/.env
        MAIL_MAILER=log
        ```
    1. 下記に修正後の.envファイルの全体の内容を記載する。

        ```アプリ名ディレクトリ/.env
        APP_NAME=Laravel
        APP_ENV=local
        APP_KEY=アプリキーの記載は各個人で異なります。
        APP_DEBUG=true
        APP_URL=http://localhost
        
        LOG_CHANNEL=stack
        
        DB_CONNECTION=mysql
        DB_HOST=127.0.0.1
        DB_PORT=3306
        DB_DATABASE=DB名
        DB_USERNAME=root
        DB_PASSWORD=皆さんの環境のMySQLのrootユーザのパスワード
        
        BROADCAST_DRIVER=log
        CACHE_DRIVER=file
        QUEUE_CONNECTION=sync
        SESSION_DRIVER=file
        SESSION_LIFETIME=120
        
        REDIS_HOST=127.0.0.1
        REDIS_PASSWORD=null
        REDIS_PORT=6379
        
        MAIL_MAILER=log
        MAIL_HOST=smtp.mailtrap.io
        MAIL_PORT=2525
        MAIL_USERNAME=null
        MAIL_PASSWORD=null
        MAIL_ENCRYPTION=null
        MAIL_FROM_ADDRESS=null
        MAIL_FROM_NAME="${APP_NAME}"
        
        AWS_ACCESS_KEY_ID=
        AWS_SECRET_ACCESS_KEY=
        AWS_DEFAULT_REGION=us-east-1
        AWS_BUCKET=
        
        PUSHER_APP_ID=
        PUSHER_APP_KEY=
        PUSHER_APP_SECRET=
        PUSHER_APP_CLUSTER=mt1
        
        MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
        MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
        ```
1. モデルファイルの修正
    1. アプリ名ディレクトリで下記コマンドを実行してusersテーブルにリンクするモデルファイルを開く。

        ```terminal
        $ vi app/Models/User.php
        ```
    1. 下記の様に修正する。

        ```アプリ名ディレクトリ/app/Models/User.php
        <?php
        
        namespace App;
        

        // 下記を修正する
        //use Illuminate\Contracts\Auth\MustVerifyEmail;
        use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract;
        use Illuminate\Auth\MustVerifyEmail;
        // 上記までを修正する
        use Illuminate\Foundation\Auth\User as Authenticatable;
        use Illuminate\Notifications\Notifiable;
        
        // 下記を修正する
        //class User extends Authenticatable
        class User extends Authenticatable implements MustVerifyEmailContract
        {
            // 下記を修正する
            //use Notifiable;
            use MustVerifyEmail, Notifiable;
        
            /**
             * The attributes that are mass assignable.
             *
             * @var array
             */
            protected $fillable = [
                'name', 'email', 'password',
            ];
        
            /**
             * The attributes that should be hidden for arrays.
             *
             * @var array
             */
            protected $hidden = [
                'password', 'remember_token',
            ];
        
            /**
             * The attributes that should be cast to native types.
             *
             * @var array
             */
            protected $casts = [
                'email_verified_at' => 'datetime',
            ];
        }
        
        ```
1. ルーティング情報の修正
    1. アプリ名ディレクトリで下記コマンドを実行してルーティングファイルを開く。

        ```terminal
        $ vi routes/web.php
        ```
    1. 下記の様に修正を行う。

        ```アプリ名ディレクトリ/routes/web.php
        <?php
        
        use Illuminate\Support\Facades\Route;
        
        /*
        |--------------------------------------------------------------------------
        | Web Routes
        |--------------------------------------------------------------------------
        |
        | Here is where you can register web routes for your application. These
        | routes are loaded by the RouteServiceProvider within a group which
        | contains the "web" middleware group. Now create something great!
        |
        */
        
        Route::get('/', function () {
            return view('welcome');
        });
        
        // 下記を修正する
        //Auth::routes();
        Auth::routes(['verify' => true]);
        ```
1. コントローラファイルの修正
    1. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを開く。

        ```terminal
        $ vi app/Http/Controllers/HomeController.php
        ```
    1. 下記の様に修正を行う。

        ```アプリ名ディレクトリ/app/Http/Controllers/HomeController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use Illuminate\Http\Request;
        
        class HomeController extends Controller
        {
            /**
             * Create a new controller instance.
             *
             * @return void
             */
            public function __construct()
            {
                // 下記を修正する
                //$this->middleware('auth');
                $this->middleware('verified');
            }
        
            /**
             * Show the application dashboard.
             *
             * @return \Illuminate\Contracts\Support\Renderable
             */
            public function index()
            {
                return view('home');
            }
        }
        ```
1. 確認
    1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

        ```terminal
        $ php artisan serve
        ```
    1. 下記リンクにアクセスする。
        - [http://127.0.0.1:8000/](http://127.0.0.1:8000/)
    1. 下記のページの右上の「REGISTER」をクリックする。

        ![Laravel-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c426be6a-2ff0-5fbd-a361-f5a4e414fa99.png)

    1. 任意の情報を入力し「Register」をクリックする。

        ![Laravel-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7e16375c-d6cf-459f-60a8-b0e2f564a855.png)

    1. 下記画面が表示されることを確認する。

        ![Laravel-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0122670f-048c-766e-4499-87cc0d8472d0.png)

    1. アプリ名ディレクトリで下記コマンドを実行してLaravelのログファイルを開く。

        ```terminal
        $ vi storage/logs/laravel.log
        ```
    1. 開いたログファイルの最終行付近に下記の様な記載があることを確認する。

        ```アプリ名ディレクトリ/storage/logs/laravel.log
        [Laravel](http://localhost)
        
        # Hello!
        
        Please click the button below to verify your email address.
        
        Verify Email Address: http://127.0.0.1:8000/email/verify/6/1107c7572edff3d7050bd4c68404ff6d0919d508?expires=1598068938&signature=a52ea1e97b368ac4b68dd2183cd3ff84d121b608556673e01c6a1aa2a5715161
        
        If you did not create an account, no further action is required.
        
        Regards,
        Laravel
        
        If you’re having trouble clicking the "Verify Email Address" button, copy and paste the URL below
        into your web browser: [http://127.0.0.1:8000/email/verify/6/1107c7572edff3d7050bd4c68404ff6d0919d508?expires=1598068938&signature=a52ea1e97b368ac4b68dd2183cd3ff84d121b608556673e01c6a1aa2a5715161](http://127.0.0.1:8000/email/verify/6/1107c7572edff3d7050bd4c68404ff6d0919d508?expires=1598068938&signature=a52ea1e97b368ac4b68dd2183cd3ff84d121b608556673e01c6a1aa2a5715161)
        
        © 2020 Laravel. All rights reserved.
        ```
    1. みなさんのlogファイルの「Verify Email Address」の後に書かれたURLにアクセスする。（本記事のリンクは筆者の環境の物なのでアクセスしても正常な処理にならない。）
    1. 下記の様なページが表示されたらメールアドレスの確認が完了し初回ログインも完了である。

        ![Laravel-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b634a1f0-1d14-9b17-7d50-48d78309fa9f.png)
        
# 参考文献

- [https://readouble.com/laravel/5.7/ja/verification.html](https://readouble.com/laravel/5.7/ja/verification.html)
- [https://qiita.com/nitaking/items/588a645968efcac6d37a](https://qiita.com/nitaking/items/588a645968efcac6d37a)
- [https://qiita.com/nekyo/items/03e50b4d0dd6f09287d6](https://qiita.com/nekyo/items/03e50b4d0dd6f09287d6)