Laravelのログイン維持(Remember me)機能でのログインをハンドリングする

php artisan make:authで作成できる、Laravelの標準ログインではログイン維持(Remember Me)機能がサポートされています。
チェックボックスをオンにしてログインすると、usersテーブルにremember_tokenを保存して、サーバセッションがタイムアウトになってもブラウザのCookieからログインを試行してくれる機能です(セッション自体はタイムアウトするためユーザーセッションに保存してたデータは空になります)。

便利な機能なのですが、先日これでログインすることにより、通常のログイン時に行っている処理がすっ飛ばされてしまったので、この機能でのログインをハンドリングする方法を調べてみました。


同じようにハマってる人もいるようです。
この機能を使用している時に、ユーザーが”remember me”クッキーを使用して認証されているかを判定するには、viaRememberメソッドを使用します。

Laravel 6.x 認証
公式マニュアルを見ると、viaRememberメソッドを使えばremember meでのログインなのかどうか判断できるようです。

検証しやすくするためにsession.phpexpire_on_closeをtrueにしておきます。
    /*
    |--------------------------------------------------------------------------
    | Session Lifetime
    |--------------------------------------------------------------------------
    |
    | Here you may specify the number of minutes that you wish the session
    | to be allowed to remain idle before it expires. If you want them
    | to immediately expire on the browser closing, set that option.
    |
    */

    'lifetime' => env('SESSION_LIFETIME', 120),

    'expire_on_close' => true,
これで、ブラウザを閉じればセッションが破棄されるようになります。

remember meでのログインを捉えるためにミドルウェアを作成します。

php artisan make:middleware RememberMeHandler
<?php

namespace App\Http\Middleware;

use Closure;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;

class RememberMeHandler
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::viaRemember()){    // Remember Meでの認証時
            Log::notice('Remember Me Logged in');
            // 行いたい処理を書く
        }
        return $next($request);
    }
}
ミドルウェアを作成したらKernel.phpに登録します。
    protected $middlewareGroups = [
        'web' => [
            …

            'remember_me_handler',
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    protected $routeMiddleware = [
       …

        'remember_me_handler' => \App\Http\Middleware\RememberMeHandler::class,
    ];
Remember Meをチェックしてログインし、一度ブラウザを閉じて再度ページを開くとログイン維持(Remember Me)機能によってログインが行われます。

このようなログが出てれば成功です。
[2020-03-26 05:09:30] local.NOTICE: Remember Me Logged in

リロードしても再度ログが吐かれることはないので、通常ログイン時の処理をここでも行うことができます。