10分でLaravelにログイン認証を追加する手順

# はじめに
LaravelのWebアプリに10分で認証機能を追加します。
予めLaravelプロジェクトやSQLite3が用意できていれば、10分もかからず3分でもできるかもしれません。。。
それくらい簡単！

# Laravel公式ガイド
Laravel公式ガイドの認証に関する情報は以下のページにあります。
ざっくり手を動かしてみたら、一読することをオススメします。

[Laravel 5.7 認証](https://readouble.com/laravel/5.7/ja/authentication.html)

# ログイン認証機能の追加手順
Laravelプロジェクトがまだ無い状態を想定して、プロジェクト作成から進めます。

## デモ用のLaravelプロジェクトを作成
### Laravelプロジェクトを作成

```bash
composer create-project laravel/laravel=5.7 laravel_auth_demo
```

### SQLiteデータベースファイル作成

```bash
touch database/database.sqlite
```

### LaravelプロジェクトのDB接続情報を変更

viで設定ファイルを開きます。

```bash
vi .env
```

以下の記述を、

```text:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
```

以下のように書き換えます。

```text:.env
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=homestead
# DB_USERNAME=homestead
# DB_PASSWORD=secret
```

### ここまでの動作確認
以下のコマンドでテスト用サーバを起動します。

```bash
php artisan serve
```

Laravelと表示されることを確認してください。

## Laravelプロジェクトに認証機能を追加
### 認証用のビューを追加
Ctrl+Cで開発サーバを停止し、以下のコマンドを実行します。

```bash
php artisan make:auth
```

`Authentication scaffolding generated successfully.`というメッセージが表示されれば成功です。
以下のファイルが新たに作成されており、web.phpも認証用に書き換えられています。

* auth/login.blade.php
* auth/register.blade.php
* auth/verify.blade.php
* auth/passwords/email.blade.php
* auth/passwords/reset.blade.php
* layouts/app.blade.php
* home.blade.php

### 認証用のテーブルを作成
以下のコマンドを実行します。

```bash
php artisan migrate
```

`Migration table created successfully.`というメッセージが表示されれば成功です。
sqlite3で`database/database.sqlite`を開いて、テーブルが作成されているか確認してください。

```bash
sqlite3 database/database.sqlite
SQLite version 3.28.0 2019-04-15 14:49:49
Enter ".help" for usage hints.
sqlite> .table
migrations       password_resets  users          
```

### ここまでの動作確認
以下のコマンドでテスト用サーバを起動します。

```
php artisan serve
```

#### アカウント登録
`http://127.0.0.1:8000/register`を開いて、アカウント登録画面が表示されることを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/9e89af6d-1d84-9ea9-e41b-e82e933201d1.png)

アカウントを登録したら、Dashboardというページが表示されます。
右上のユーザアカウント名のセレクトボックスからLogoutを選択してログアウトしてみてください、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/f46f354a-54b7-920d-162c-e0ab4c573c50.png)

#### ログイン
`http://127.0.0.1:8000/login`を開いて、ログイン画面が表示されることを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/b681df3e-2deb-dbfb-f375-519938afef95.png)

先ほど作成したユーザ情報でログインできることを確認してください。
※パスワードのリセット機能は、サーバからメールを送信する機能を実装しないと動作しません

ここまでで、Laravelにログイン認証機能を追加する対応は完了です。

# ルートの保護を行う
この時点では、まだユーザの登録・ログインができるだけなので、どのビューに対してもログインによる保護がかかっていない状態（ログインしていなくてもアクセスできてしまう状態）です。
そのため、ルートの保護を設定してログインしていないと見れないページを作成してみます。

## 確認用のテストページを追加

ビューファイルを作成します。

```bash
touch /resources/views/test.blade.php
```

以下のような内容で保存しておきます。

```php:test.blade.php
<h1>テストページ</h1>                                                                                              
<p>このページはログインしているユーザにしか見せたくない。。。</p>
```

## テストページへのルーティングを設定

web.phpを開きます。

```bash
vi /routes/web.php
```

テストページへのルーティングを設定します。

```php:web.php
<?php                                                                                                              
 
/*
|--------------------------------------------------------------------------
| 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');
});
Route::get('/test', function() {  // 追加
    return view('test'); // 追加
}); // 追加
 
Auth::routes();
 
Route::get('/home', 'HomeController@index')->name('home');
```

## 動作確認
`http://127.0.0.1:8000/test`へアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/83d3f9f0-723a-9fe2-a1da-355e0e10f51f.png)

まだ保護していないので、ログインしていないのにページが見えちゃいますね。。。

## ルートの保護を行う

web.phpを再度開きます。

```bash
vi /routes/web.php
```

以下の設定を追加します。これがルートの保護に関する設定です。
たったこれだけでログインしていないとアクセスできないルーティングになります。

```php:web.php
<?php                                                                                                              
 
/*
|--------------------------------------------------------------------------
| 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');
});
Route::get('/test', function() {
    return view('test');
})->middleware('auth'); // 修正
 
Auth::routes();
 
Route::get('/home', 'HomeController@index')->name('home');
```

## 改めて動作確認
`http://127.0.0.1:8000/test`へアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/b681df3e-2deb-dbfb-f375-519938afef95.png)

ルートの保護がされているビューをログインしていない状態で表示しようとすると、ログインページへリダイレクトされます。
続けてログインすると、もともと見ようとしていたビューを表示してくれます。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/83d3f9f0-723a-9fe2-a1da-355e0e10f51f.png)

# まとめ
10分でLaravelプロジェクトにログイン認証機能を追加できましたでしょうか？
慣れれば10分と言わず、3分もかからずに追加できるほど簡単ですね。