Laravelの認証ルーティングから探る、提供される認証機能5つ

 

以前の記事でLaravelに認証機能を入れる方法を記事にしました。

 

Laravelの認証機能を使って実装できる5つの機能がありますので、見ていけたらと思います。

まずはルーティングを探り、どんなページが追加されているのか見てみたいと思います。

 

当記事執筆時点でLaravelバージョン7.6を使用しております。

 

認証機能の導入方法が知りたい場合はこちらの記事からどうぞ。

関連記事

  今回はLaravelを使って認証機能を導入してみたいと思います。 バージョン5以前では「php artisan make::auth」コマンド実行のみで導入できたようですが、そのコマンドがなくなってしまっているとい[…]

Laravel7.3に認証機能を導入する方法

 

Auth::routes()を見てみる

 

認証機能を導入したときに、ルーティングの routes/web.php に新しい定義が追加されています。

それは以下の2つです。

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

 

下の方は /home にアクセスしたときに HomeControllerのindex メソッドを呼ぶものとすぐわかるので、Auth::routes()の中身を見てみたいと思います。

 

Auth の正体は Authファサードであり、その routes()メソッドを呼んでいます。routes()メソッドは以下の通り。

 

public static function routes(array $options = [])
{
    static::$app->make('router')->auth($options);
}

 

この auth() メソッドは何かというと、 まず、\Laravel\Ui\UiServiceProvider にて Illuminate\Routing\Router クラスに \Laravel\Ui\AuthRouteMethods が読み込まれます。

この \Laravel\Ui\AuthRouteMethods クラスに定義されている auth() メソッドを呼び出しています。

 

内部の処理は複雑ですね、やっぱりLaravelさんはすごいです。

ここでやっとルーティング定義一覧に辿り着きました。\Laravel\Ui\AuthRouteMethods クラスを見てみましょう。

ここでは、auth() メソッドのみ抜き出しています。

// \Laravel\Ui\AuthRouteMethods::auth()

public function auth()
{
    return function ($options = []) {
        // 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...
        if ($options['register'] ?? true) {
            $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
            $this->post('register', 'Auth\RegisterController@register');
        }

        // Password Reset Routes...
        if ($options['reset'] ?? true) {
            $this->resetPassword();
        }

        // Password Confirmation Routes...
        if ($options['confirm'] ??
            class_exists($this->prependGroupNamespace('Auth\ConfirmPasswordController'))) {
            $this->confirmPassword();
        }

        // Email Verification Routes...
        if ($options['verify'] ?? false) {
            $this->emailVerification();
        }
    };
}

 

これを見てみると機能は、基本機能、登録、パスワードリセット、パスワード確認、メール認証の5機能に分けられそうですね。

 

先程のコードを見てみればわかるかと思いますが、機能の中には Auth::routes() にオプションを与える必要があるものもあります。

次に各機能の紹介と同時にオプションの渡し方も書いておきます。

 

基本機能(ログイン、ログアウト)

 

基本機能にはログイン機能とログアウト機能があります。

 

こちらは Auth::routes() に対して特にオプション指定なしに使うことができますが、後述の登録機能を使ってユーザをDBに登録しておく必要があります。

 

Auth::routes() で言うところの以下の部分ですね。

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

 

早速 /login にアクセスしてみるとログインフォームが表示されます。

laravelの認証ログイン画面

 

登録しているユーザでログインでき、ログアウトも実装されていることが確認できます。

laravelの認証のログアウト画面

 

登録機能

 

ユーザを登録したいときに使います。使いたくない場合には Auth::routes() には以下のようにオプションを与えます。

Auth::routes(['register' => false]);

 

使いたくない場合のシナリオとしては一般ページと管理者ページを分ける場合や、社内システムなどで管理者が登録する場合でしょうか。

 

また、このときルーティングに追加されるのは、以下の定義です。

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

 

登録を有効にした状態で /register にアクセスしてみると 登録フォームが出てきました。マイグレーションが完了していれば登録もできるはずです。

laravelの認証の登録画面

 

パスワードリセット機能

 

パスワードを忘れてしまってログインできなくなってしまったときに使用します。Laravelではパスワードを忘れてしまったユーザに対してメールからパスワードをリセットする機能もデフォルトで提供してくれています。

使いたくない場合には Auth::routes() にオプションを与えます。

Auth::routes(['reset' => false]);

 

また、このときルーティングに追加されるのは、以下の定義です。

$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')
    ->name('password.update');

 

リセット機能を有効にして、 ログイン画面のリンクから飛ぶか、/password/reset にアクセスすると、リセット用フォームが表示されます。

laravelの認証のリセット画面

 

フォームを送信すると、登録済みのメールアドレス宛にメールが届きますので、ボタンをクリック。

laravelの認証のパスワードリセット用メール

 

パスワードリセット用フォームが表示されますので、送信するとパスワードリセットができます。

laravelの認証のリセット画面

 

パスワード確認機能

 

パスワード確認機能は、重要な操作を行う前にパスワードをもう一度入力させるものです。ミドルウェアに登録しておくと特定ページに遷移する前にパスワード入力フォームを表示させます。

 

Auth::routes() に引き渡すオプションはありません。ただ、コントローラが配置してあるディレクトリに Auth/ConfirmController.php が存在している必要があります。(認証機能導入と一緒に作成されているはずです。)

 

定義されるルーティングは以下の通りです。

// Authentication Routes...
$this->get('password/confirm', 'Auth\ConfirmPasswordController@showConfirmForm')
    ->name('password.confirm');
$this->post('password/confirm', 'Auth\ConfirmPasswordController@confirm');

 

ちなみに使用する際には以下のように password.confirm ミドルウェアを使用します。

Route::get('want/to/double/confirm', 'SomethingController@index')
    ->middleware('password.confirm');

 

上記の通りミドルウェアの設定をしたら、セットしたURLにアクセスしてみます。すると、パスワードが要求されます。無事入力できれば、次の画面に進むことができます。

laravelの認証のパスワード再確認

 

メール認証機能

 

最後に、メール認証機能です。こちらは、登録後にメールが送信され、メールのリンクをクリックすることで、本登録が完了する機能になります。

登録されたメールアドレスが有効なものかというだけでなく、本人のもで有るかということも確認できます。

 

こちらは使用したい場合にはオプションを引き渡します。

Auth::routes(['verify' => true]);

 

また、メール認証を使うには、User モデルとルーティングに手を入れる必要があります。

 

app/User.php を開き、MustVerifyEmail を implements しましょう。

class User extends Authenticatable implements MustVerifyEmail // <- 追加
{
    use Notifiable;

 

また、認証が必要なページに valified ミドルウェアを使うように指定します。

Route::get('after/login/page', SomethingController@index)
    ->middleware('verified') // <- verifiedミドルウェアを使用

 

上記設定を終えた後に /register にアクセスし、新規ユーザを登録します。すると、先程とは違い、メールを送信した旨が表示されます。

laravelの認証のメール送信確認画面

 

メールが届いているかと思いますので、ボタンをクリックしたら本登録完了です。

laravelの認証の登録確認メール

 

最後に

 

Laravelでは簡単に認証機能を導入することができ、簡単にそれを使い始めることができます。

実際に自身でこれらを実装しようとしたらとても時間がかかるかと思います。

フレームワークを使って効率よく開発していくことで、こういった必須機能の実装を省略できるのは非常に魅力的ですね。