【Laravel入門】ユーザー認証機能と仮想メールサーバ

今回はログイン機能を実装したい。さらに、仮想メールサーバの設定も含めて説明する。

まずはプロジェクトを作成し直したので、以下をサクッと設定する。最終的には掲示板形式のアプリにしたいので、プロジェクト名は``larabbs``とした。

- storageとbootstrap/cacheへのアクセス権限付与
- config/app.phpの編集
- データベース作成
- .env編集

# ユーザー認証機能の設定

Laravelでは``Auth``という認証機能が提供されている。

公式ドキュメントより（一部抜粋）

>インストールしたてのLaravelアプリケーションにて、php artisan make:authとphp artisan migrateを実行するだけです。

>>Laravelでは簡単に認証が実装できます。実際ほとんど全て最初から設定済みです。認証の設定ファイルはconfig/auth.phpに用意してあり、認証サービスの振る舞いを調整できるように、読みやすいコメント付きでたくさんのオプションが用意されています。

>>Laravelの認証機能は「ガード」と「プロバイダ」を中心概念として構成されています。ガードは各リクエストごとに、どのようにユーザーを認証するかを定義します。たとえば、Laravelにはセッションストレージとクッキーを使いながら状態を維持するsessionガードが用意されています。

>>プロバイダは永続ストレージから、どのようにユーザーを取得するかを定義します。LaravelはEloquentとデータベースクリエビルダを使用しユーザーを取得する機能を用意しています。しかし、アプリケーションの必要性に応じて、自由にプロバイダを追加できます。

>>混乱しても心配ありません。通常のアプリケーションでは、デフォルトの認証設定を変更する必要はありません。

一部理解が不十分な用語もあるが・・・要は、``Laravelのログイン機能=ユーザー認証機能の設定はすでに下地が作られているので、あとはそれを実行（反映）させるだけでOK！``ということだ。早速作業を進める。

## マイグレーションファイルの編集

両方ともデフォルトで用意されているファイルだ。それぞれインデックスがuniqueとindexの``emailカラム``は、文字列を191文字以内に制限する。

```2014_10_12_000000_create_users_table.php
$table->string('email', 191)->unique();
```

```2014_10_12_100000_create_password_resets_table.php
$table->string('email', 191)->index();
```

## Auth機能の追加

たったこれだけ。

```
$ php artisan make:auth
Authentication scaffolding generated successfully.
```

## テーブルの作成

上記のファイルに基づき、マイグレーションでテーブルを作成する。これで``userテーブル``と``password_resetsテーブル``が作成された。（さらに``migrationsテーブル``も！）

```
$ php artisan migrate
Migration table created successfully.
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
```

実際にサーバを起動して確認すると、本当に``php artisan make:auth``、``php artisan migrate``の２つのコマンドだけで、ユーザー登録やログインができた。これは簡単。

# 仮想メールサーバの設定

## mailtrapの利用

Authで認証機能を実装すると、パスワードを忘れた場合に再設定用のメールが送られてくる。しかし、現在の状態ではエラーになってしまう。これはメールサーバが登録されていないためだ。

今回作成したアプリでは``SMTP``という方法でメールが送信されているが、これを扱うサーバを用意しなければ、送受信の確認ができない。

ここで役に立つのが、``仮想SMTPサーバ``だ。これを利用すれば、``メールを実際に送ることなく送受信状況をWebサーバ上で確認``できる。目的がメールの送受信テストのみであれば、非常に役に立つ。

laravelは、デフォルトで仮想SMTPサーバ``mailtrap``に対応している。設定も簡単なので、今回はこれを使用する。

[mailtrap公式サイト（全て英語）](https://mailtrap.io)

もちろん会員登録は必要になるが、GitHubアカウントでログインできるのは嬉しいところ。無料枠で利用できるメールボックスは１つのみだが、動作確認にはこれで十分だ。

ログインしたら、まず``My Inboxes``からメールボックスを選択する。メールボックスはデフォルトの``Demo inbox``を使用しても良いし、これを削除して作成し直しても良い。

その後、選択したメールボックスのメール送受信状況や設定に必要な情報を見ることができる。設定については``SMTP Settings``タブを見よう。今回の設定に必要な情報は、全てここにある。

設定方法は``.env``で環境変数を登録する方法と、``config/mail.php``を直接編集する方法の２種類がある。それぞれ紹介する。

## .envを編集

``SMTP Settings``タブの``Credentials``で各項目を確認する。書き換える項目は``MAIL_USERNAME``と``MAIL_PASSWORD``だけだ。

```
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=Username
MAIL_PASSWORD=Password
MAIL_ENCRYPTION=null
```

## mail.phpを編集

``SMTP Settings``タブの``Integrations``では、フレームワークごとにconfigファイルの設定に必要なコードが表示される。Laravel版はこちら。

```
return array(
  "driver" => "smtp",
  "host" => "smtp.mailtrap.io",
  "port" => 2525,
  "from" => array(
      "address" => "from@example.com",
      "name" => "Example"
  ),
  "username" => "Username",
  "password" => "Password",
  "sendmail" => "/usr/sbin/sendmail -bs",
  "pretend" => false
);
```

書き換えるべきファイルは```config/mail.php```。デフォルトでは以下の記述がされている。return文以下を上記のコードに書き換えよう。

改めてmail.phpを見ると、どこに.envの環境変数が反映されているか、メールサーバ構築に必要な設定は何かということが、少し見えてきた気がする。

```config/mail.php
<?php

return [    
    'driver' => env('MAIL_DRIVER', 'smtp'),
    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),   
    'port' => env('MAIL_PORT', 587),
    'from' => [
        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
        'name' => env('MAIL_FROM_NAME', 'Example'),
    ],    
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
    'username' => env('MAIL_USERNAME'),
    'password' => env('MAIL_PASSWORD'),
    'sendmail' => '/usr/sbin/sendmail -bs',    
    'markdown' => [
        'theme' => 'default',
        'paths' => [
            resource_path('views/vendor/mail'),
        ],
    ],

];
```

## 動作確認

.envやmail.phpを書き換えたら、サーバを再起動する。

```
$ php artisan serve
```

もしくは設定ファイルを反映させるコマンドもある。しかし、このコマンドには注意が必要だ。詳しくは公式ドキュメントを参考にして欲しい。ローカル開発環境では、環境変数をenv関数のみに設定しなければコマンドを利用することができないそうだ。

[Laravel 5.5 設定](https://readouble.com/laravel/5.5/ja/configuration.html)

```
$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!
```

これで、mailtrap上でパスワード再設定時のメールの送受信状況が確認できる。公式サイト内は全て英語だが、レイアウトが見やすいので助かる。

あと、重要なのは``.envやconfigファイルを編集した時には必ず上記のどちらかを行う``ことだ。

実は、正しい設定でメールの送受信確認をした後に、.envファイルを編集し誤った記述をしてしまった。しかし、サーバの再起動やconfigファイルの反映をしないまま動かしたら、そのまま正常に動いてしまったのだ。恐ろしい・・・

今回はここまで。