Laravel5.6でパッケージを利用して簡単に４桁数字認証を実装

# ４桁認証機能をパッケージを使って実装
２段階認証などで、実装する機会がありそうな４桁数字認証機能を
Laravelで簡単に実装出来そうだったので試してみました。

### 参考
[Laravel Newsの記事](https://laravel-news.com/under-construction)
[４桁認証機能パッケージのgithub] (https://github.com/larsjanssen6/underconstruction)

### 環境
PHP 7.1.7
Laravel 5.6.5

#　準備
githubに書いてある通りにやりました。


まずはcomposerでパッケージを入れます。

```
composer require larsjanssen6/underconstruction
```

コンフィグに追加します。

```PHP:config/app.php
'providers' => [
    // ...
    'LarsJanssen\UnderConstruction\UnderConstructionServiceProvider'
];
```
カーネルにも追加します。認証系の機能なので`routeMiddleware`に設定

```PHP:app/Http/Kernel.php

protected $routeMiddleware = [
  // ...
  'under-construction' => \LarsJanssen\UnderConstruction\UnderConstruction::class,
];
```
パッケージの設定をファイルに切り出すのに便利な`publish`を使います。

```
php artisan vendor:publish

# 適切なものを選択

php artisan vendor:publish --provider="LarsJanssen\UnderConstruction\UnderConstructionServiceProvider"
```
# 設定
以下設定用ファイル

```PHP:under-construction.php
<?php

return [

    /*
     * Activate under construction mode.
     */
    'enabled' => env('UNDER_CONSTRUCTION_ENABLED', true),

    /*
     * Hash for the current pin code
     */
    'hash' => env('UNDER_CONSTRUCTION_HASH', null),

    /*
     * Under construction title.
     */
    'title' => 'Under Construction',

    /*
     * Back button translation.
     */
    'back-button' => 'back',

    /*
     * Show button translation.
     */
    'show-button' => 'show',

    /*
     * Hide button translation.
     */
    'hide-button' => 'hide',

    /*
     * Redirect url after a successful login.
     */
    'redirect-url' => '/',

    /*
     * Enable throttle (max login attempts).
     */
    'throttle' => true,

    /*
    |--------------------------------------------------------------------------
    | Throttle settings (only when throttle is true)
    |--------------------------------------------------------------------------
    |
    */
    
    /*
     * Set the maximum number of attempts to allow.
     */
    'max_attempts' => 3,

    /*
     * Show attempts left.
     */
    'show_attempts_left' => true,

    /*
     * Attempts left message.
     */
    'attempts_message' => 'Attempts left: %i',

    /*
     * Too many attempts message.
     */
    'seconds_message' => 'Too many attempts please try again in %i seconds.',

    /*
     * Set the number of minutes to disable login.
     */
    'decay_minutes' => 5,
];
```
・`enable`で機能を使うか設定出来る。
・`hash`で認証キーのHASH値の元ネタを指定。
・`max_attempts`で失敗回数設定
・`decay_minutes`で再度入力出来るまでの時間を設定
・他にもレイアウト指定などがある

以下ルーティング例

```PHP:routes/web.php
Route::group(['middleware' => 'under-construction'], function () {
    Route::get('/', function () {
        return view('welcome');
    });

    Route::get('/live-site', function() {
        echo 'content!';
    });
});
```

# 設定コマンド

以下のコマンドで特定の４桁を認証数値に設定出来ます。`.env`にHASH値が記入されます。

```
php artisan code:set 1234
```

# 確認
出ました！

<img width="1083" alt="スクリーンショット 2018-02-26 2.25.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/207269/41389cac-0a5c-7936-c5d3-d04972095beb.png">

失敗すると`attempts_message`のメッセージが出ます。
<img width="849" alt="スクリーンショット 2018-02-26 2.26.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/207269/048cd051-029f-4d96-ebe1-faba8bcff496.png">

３回失敗すると`seconds_message`のメッセージでカウントダウンが始まります。

<img width="877" alt="スクリーンショット 2018-02-26 2.26.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/207269/325b7b6a-053c-5621-c915-1185960417c4.png">

# 感想
ここまでは簡単に実装できました。
あとは認証キーをユーザーごとに持たせたり、都度生成できるようにカスタマイズすれば
実際のサービスで使えるレベルになるかなぁという感じでした。