Larave日記4 - Authを使ってみる-

こんにちは、気がついたら前回の日記からだいぶ時間が経過してしまいました。。。汗

さて、今回はLaravelに標準で備わっているAuthを使ってログインの仕組みを実装してみたいと思います。

## 前提の環境
以下の環境で実装しています。
- PHP7.1
- MySQL5.7

まずデータベースを作成する必要があります。

MySQLにログインした状態で、以下のコマンドを実行します。

```
CREATE DATABASE mycms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```

すると、MySQL内に「mycms」というデータベースが作成できました。

　続いて、.envファイル内を確認し、9〜14行目あたりを実際の状態に書き換えます。

```
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=mycms
DB_USERNAME=root
DB_PASSWORD=
```

また、データベースそのものを作成しておく必要もあります。

それでは、mysql.server startコマンドでMySQLを起動した状態から次項目の内容をスタートします。

ここまで説明したデータベース関連の設定について詳しく確認したい場合、[[PHP] Macで、Laravel5.6の、起動、MySQL接続設定まで行う
](https://www.yoheim.net/blog.php?q=20180503)をご覧いただくとわかりやすいかなと思います。

## LaravelのAuthって？？
そもそもAuthって何なのでしょうか。

> Laravelの認証機能には「ログイン」「ユーザ登録」「パスワードリセット」の３つがあります。今回の作業でこの３つの機能を構築する事が出来ます。それぞれの実装を行わなくても一度にこれらの機能が構築できるので、これからその作業を行っていきます。（[Laravelの認証機能でログイン/ユーザ登録/パスワードリセットなどの管理画面を一撃構築する（基本＆入門編）より引用](https://www.ritolab.com/entry/51)）

ということで、Authとは要するにLaravelに備わっている機能を使って簡単に「ログイン」「ユーザ登録」「パスワードリセット」つまりユーザー認証の仕組みを実装することができる、というものになります。

しかも、セキュリティに関する部分も本来自分で細々実装しなければならないところを、Laravelが初めから対策済みの状態にしてくれているので、安心安全に使うことができるというわけです。

## まずはAuthを実装してみる
それでは、Authを実装してみたいと思います。以下のコマンドを、Laravelプロジェクトにて実行します。

```
php artisan make:auth
```

さらに以下を入力

```
php artisan migrate
```

すると、何やら色々な動きが始まります。

<img width="516" alt="スクリーンショット 2018-12-08 8.32.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/250202/27609e3e-7db1-1dd1-f5df-57e620f7bca0.png">

ふむふむ。

routes/web.phpを見てみると、以下のコードが追加されていました。

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

```

そして、データベースの中身を確認してみます。

mysqlにログインの上、mycmsデータベースを選択。

そして、show tablesコマンドを実行すると。。。。

<img width="238" alt="スクリーンショット 2018-12-16 8.23.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/250202/5b59212b-7ce8-2226-01d4-b94fecf1f1d4.png">

MySQLの操作が怪しい場合は右記ページなど参照・・・[【MySQL, SQL】データベースを扱う基本SQL一覧](https://qiita.com/knife0125/items/bb095a85d1a5d3c8f706#%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E9%81%B8%E6%8A%9E)

そして、php artisan serveコマンドを実装してサーバを起動、localhost:8000/registerにて表示内容を確認してみます。

![スクリーンショット 2018-12-08 8.39.37.png](https://qiita-image-store.s3.amazonaws.com/0/250202/a2333be7-0a88-17b2-a925-1c41b18856fb.png)

ええええ、なんかもう色々できている。。。。これはすごいですね。


試しに、右上にあるRegisterの部分から会員登録をしてみたいと思います。


すごい、フォームも完璧にできているではありませんか・・・・
必要項目を入力してRegisterボタンを入れてみます。すると・・・

![スクリーンショット 2018-12-08 8.39.28.png](https://qiita-image-store.s3.amazonaws.com/0/250202/2c7d9e2c-31eb-586f-ce66-ca55c3203981.png)

おお！ログインできている！
ちゃんとユーザー名「kotsuban-teikin」も出てきています。

http://localhost:8000/login にアクセスしてログインも実行したらできていました。

おそるべし・・・

## make:authにて一体何が起きていたのか

さて、いよいよmake:authで何が変化したのか、何が起きていたのかを自分なりに追ってみたいと思います。

make:authを実装することによってユーザー登録ができるようになっており、ユーザー登録後は、きちんとデータベースからユーザー名を引っ張って、ページ右上あたりに「kotsuban-teikin」という文字が表示されるようになっていました。

make:authを実行することによって

- resources/views内に認証関連で最低限必要なviewファイルを生成
- データベースとの連携を測るなど、認証関係のページで司令塔の役割を果たすcontrollerファイルがapp/Http/Controllersフォルダ内に生成
- 必要なルーティング設定がroute/web.php内に追記

されるようになっています。（他にもありそうな気はしますが）

ただし、これだけではまだダメで、データベース内にテーブルを作成しないとユーザー情報を登録していくことができません。

ここで出てくるのが

```
php artisan migrate
```
というコマンドです。

## migrate（マイグレーション）とは？？

マイグレーションは、簡単にいうとSQLを触ることなくデータベースを作成したりテーブル構成を変更したりする機能です。

「どんなテーブル構成にしたいのか」をmigrationファイルというものに記述していき、それをphp artisan migrateによって実際の構成に反映させることができます。

Laravelのmake:authを使うと、初めからdatabase/migrations内に入っているuser関連のマイグレーションファイルを、そのままデータベースに反映させることができるようになるわけです。

```php:database/migrations/2014_10_12_000000_create_users_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}
```

確かにコードを見てみると、なんとなく「どんなテーブルにしたいか」を定義するための内容が入っているなぁ〜というのが確認できます。

## 次回について
次回は、色々記事の新規登録＋表示をやっていきたいと思います。

先に認証機能をやるのも変かなと思ったのですが、make:authを使って変更された記述を、今度は自分で書いていくようなイメージでいけたらわかりやすいのかな？と勝手に思い、make:authを先にやってみました。