Laravelのmake authで認証機能を作る


Laravelで認証機能を作るメリット

認証機能を作る場合SQLインジェクションCSRFなどセキュリティ対策を自分で実装しなければなりません。Laravelで用意されているmake authは対策が実装されたうえ、安全に認証機能の構築ができます。

Laravelのバージョン確認

workspaceに入りバージョンの確認をします。
今回はLaradockで動くLaravelで認証機能を構築します。

docker-compose exec --user=laradock workspace bash
aradock@1a3f8c1ad270:/var/www$ cd develop/
laradock@1a3f8c1ad270:/var/www/develop$ php artisan -V

Laravel Framework 5.5.45

make authコマンドの実行

make:authコマンでログイン、ユーザ登録、パスワードリセットのベースを構築する事が出来ます。

laradock@1a3f8c1ad270:/var/www/develop$ php artisan make:auth
Authentication scaffolding generated successfully.

モデル生成

コマンドを実行するとapp/User.phpにモデルが生成されます。

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use 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',
    ];
}

ルーティング更新

web.phpが更新されます。
Authはログインやログアウトなどのユーザー認証関連のルート情報をまとめたクラスです。

Auth::routes();

フレームワーク内の
/vendor/laravel/framework/src/Illuminate/Routing/Router.phpのauthをさしています。

public function auth()
{
    // Authentication Routes...
    $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
    $this->post('login', 'Auth\LoginController@login');
    $this->post('logout', 'Auth\LoginController@logout')->name('logout');

    // Registration Routes...
    $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
    $this->post('register', 'Auth\RegisterController@register');

    // Password Reset Routes...
    $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
    $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
    $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
    $this->post('password/reset', 'Auth\ResetPasswordController@reset');
}

コントローラー生成

/app/Http/Contollers/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');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('home');
    }
}

認証用のコントローラーとして、/app/Http/Controllers/Authディレクトリに以下のファイルが生成されます。

┗app
  ┗Http
    ┗Controllers
      ┗Auth
        ┣ForgotPasswordController.php 
        ┣LoginController.php
        ┣RegisterController.php
        ┗ResetPasswordController.php

テンプレート生成

resources
  ┗views
    ┣auth
    ┃┣passwords
    ┃┃┣email.blade.php
    ┃┃┗reset.blade.php
    ┃┣login.blade.php
    ┃┗register.blade.php
    ┣layouts
    ┃┗app.blade.php
    ┗home.blade.php

migarateの実行

認証で使用するマイグレーションファイルは
ユーザーテーブルとパスワードリセット用のテーブルが生成されます。

┗database
  ┗migrations
    ┣2014_10_12_000000_create_users_table.php
    ┗2014_10_12_100000_create_password_resets_table.php

migrateコマンドでテーブルを追加します。

laradock@1a3f8c1ad270:/var/www/develop$ 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

データベースの確認

認証用テーブルが生成されたことをphpMyAdminから確認します。
usersとpassword_resetsテーブルが作られていたらOK

認証機能の確認

以下からユーザーを追加し、ログイン
http://localhost/register

メール設定

ユーザー登録後に「Forgot Your Password?」をクリックしてリセットメールを送るとメール設定をしていない場合エラーとなります。

こちらよりアカウントを作成
https://mailtrap.io/

アカウント情報を.envに設定し、キャッシュをクリア

laradock@90afbecc4a0c:/var/www/develop$ vi .env

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=[↑のUsername]
MAIL_PASSWORD=[↑のPassword]
MAIL_ENCRYPTION=null

laradock@90afbecc4a0c:/var/www/develop$ php artisan config:cache

↓がhtmlメールのテンプレートで
resources/views/auth/passwords/email.blade.php
受信できてら完了

仮登録、本登録の実装はこちらがわかりやすいです。