【AmazonLinux2/Laravel】Laravelで認証機能作成

Laravelでは、標準で会員登録やログインなどの必要最低限の機能が一通り揃っています。

実際に作成する場合も、いくつかのコマンドを叩くだけなので便利なのですが、いつも自分で実装していると、簡単にできてしまいすぎて、何が起きているのかわからないと気持ち悪いですよね。
なので、実際にどんなことをやっているのかを確認していきたいと思います。

## 認証用のデータベースの準備

ここでは、RDSでAurora MySQLが、すでに準備されていることとします。

AmazonLinux2では、標準の yum や、amazon-linux-extras では、MySQLクライアントがインストールできないので、公式のリポジトリを有効化してMySQL5.7クライアントのインストールを行います。

```terminal
$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
$ sudo yum-config-manager --disable mysql80-community
$ sudo yum-config-manager --enable mysql57-community
$ sudo yum install mysql-community-client
```
Mysqlクライアントをインストールしたら、RDSに接続して、データベースを作成します。データベース名は任意ですが、一旦 tools という名称で進めます。

```terminal
mysql> create database tools;
```

Laravelのデータベース用の設定ファイルを変更します。
Laravelでは、標準の文字コードがutf8mb4となっています。
utf8mb4は、絵文字などの4バイト文字にも対応した文字コードになりますが、テーブル作成時に、エラーが出てしまう場合は、utf8に変更しましょう。
問題なければ、そのままでも構いません。
MySQL5.7.7未満のバージョンの場合に、767bytes制限を超えた、emailカラムの作成時にエラーになります。

文字コードをutf8へ変更

```php:config/database.php
//'charset' => 'utf8mb4',
'charset' => 'utf8',
//'collation' => 'utf8mb4_unicode_ci',
'collation' => 'utf8_unicode_ci',
```

## 認証用のファイル生成

認証用の機能を追加するために、下記のコマンドを実行します。
実行後、必要なファイルが生成されます。

```terminal
$ php artisan make:auth
```

設定ファイルにデータベース情報をセットします。
.env(.env.development)設定

```conf:.env
APP_NAME=Tools
APP_ENV=development
APP_KEY=base64:******************************************
APP_DEBUG= true
APP_URL=http://ドメイン

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=（RDSのエンドポイント）
DB_PORT=3306
DB_DATABASE=tools
DB_USERNAME=(ユーザー名)
DB_PASSWORD=(パスワード)

:
:

```

## 認証用のテーブル作成

```terminal
$ APP_ENV=development php artisan migrate
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
```
usersテーブルと、password_resetsテーブル、さらに管理テーブルとして、migrationsテーブルの3つが作成されます。

これで認証機能の作成は完了です。

サイトにアクセスすると、右上に、「LOGIN」「REGISTER」のリンクが追加されているかと思います。
実際に、「REGISTER」から会員登録を行い、認証機能が利用できることを確認してみてください。

## 自動生成の内容の確認

ただ、こんな感じで自動生成すると、実態がよくわからなくて変更したいときや、問題があった際にどうして良いのかわからなくなってしまうので、まずは何が起きたのかを確認していきます。

追加されたファイル

```terminal
app/Http/Controllers/HomeController.php
resources/views/home.blade.php
resources/views/auth/login.blade.php
resources/views/auth/passwords/email.blade.php
resources/views/auth/passwords/reset.blade.php
resources/views/auth/register.blade.php
resources/views/auth/verify.blade.php
resources/views/layouts/app.blade.php
```

変更されたファイル

```terminal
routes/web.php
```

## ルーティングについて

routes/web.phpに、下記の2行が追加されています。

```php:routes/web.php
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
```

Route::get('/home', 'HomeController@index')->name('home');
の方は、Laravelのルーティングについて理解している方であれば、　/home でリクエストされた際に、HomeControllerのindexメソッドが実行されるということでわかりやすいですね。

ただ、
Auth::routes();
は、まとめられすぎてちょっとわかりにくいですね。

ということで、あえて、Auth::routes(); は使わずに、同じ動作を実現してみようかと思います。

```php:routes/web.php
//Auth::routes();

Route::namespace('Auth')->group(function(){
    Route::get('login','LoginController@showLoginForm')->name('login');
    Route::post('login','LoginController@login');
    Route::post('logout','LoginController@logout')->name('logout');

    Route::prefix('password')->name('password.')->group(function(){
        Route::post('email','ForgotPasswordController@sendResetLinkEmail')->name('email');
        Route::get('reset','ForgotPasswordController@showLinkRequestForm')->name('request');
        Route::post('reset','ResetPasswordController@reset')->name('update');
        Route::get('reset/{token}','ResetPasswordController@showResetForm')->name('reset');
    });
    Route::get('register','RegisterController@showRegistrationForm')->name('register');
    Route::post('register','RegisterController@register');

});

Route::get('/home', 'HomeController@index')->name('home');
```

上記が実際に、Auth::routes(); で設定されているルーティングになります。
通常は、Auth::routes();を利用して問題ありませんが、URLなど必要に応じてカスタマイズする必要がある際には、上記を変更してあげることで実現可能になります。


## 認証機能について

認証機能は、下記のコマンドで必要なファイルが自動生成されました。

```terminal
$ php artisan make:auth
```

ただ、実際に生成されたのは、認証機能に必要なViewファイルのみとなります。
ですので、基本的にはLaravelではインストール後にすでに認証機能自体は含まれていることになります。
実際の中身は、
app/Http/Controllers/Auth 以下にControllerがあるので、確認してみてください。

ですので、少しだけ複雑な認証機能の実装が必要な場合でも、コマンドで自動生成するとカスタマイズがしづらいからという理由で、安易に1から認証機能を実装せずに、一旦標準の認証機能を確認して、利用できるところは利用してみるのが良さそうですね。