Laravel

【Laravel】Remember Me Cookieの有効期限を変更する方法

【Laravel】Remember Me Cookieの有効期限を変更する方法

今回は、LaravelでRemember Me Cookieの有効期限を変更する方法をお伝えします。

少しでもあなたの疑問解決のお役に立てれば幸いです。

バージョン情報
  • Laravel:8.0
  • PHP:7.3.23

【Laravel】Remember Me Cookieの有効期限を変更する方法

Laravelの場合、Sessionの期限(通常のログイン状態が維持される時間の長さ)はsession.phpのSESSION_LIFETIMEで簡単に変更できます。

/*
|--------------------------------------------------------------------------
| 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),

 

しかし、Remember Meの場合は、以下のように期限が直接記述されている(ハードコードされている)ため、簡単に変更することができません。

public function forever($name, $value, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null)
{
    return $this->make($name, $value, 2628000, $path, $domain, $secure, $httpOnly, $raw, $sameSite);
}
// CookieJar.php

※2628000分=5年です

 

そこで私が行ったのが、新しい期限でCookieを上書きする方法です。

他にも良い方法があるかもしれませんが、一応この方法で期限を変更できることは確認できました。

 

以下で方法を説明していきます。

 

LaravelでRemember Cookieの期限を変更する

今回は、rememberがtrueだった場合にRemember Cookieの期限を変更する処理を実装しました。

以下にControllerのコードを掲載します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cookie;

class LoginController extends Controller
{
    public function login(Request $request)
    {
        $remember = $request->remember_me;
        if (!Auth::attempt($request->only('name', 'email', 'password'), $remember)) {
            return redirect('/login');
        };

        if ($remember) {
            $remember_cookie_name = Auth::getRecallerName();
            Cookie::queue(
                $name = $remember_cookie_name,
                $value = Cookie::queued($remember_cookie_name)->getValue(),
                $minutes = 10080, // 7日
                $path = '/',
                $domain = null
            );
        }

        return redirect('/main');
    }
}

 

$rememberがtrueだった場合(Remember Cookieが付与された場合)にCookieの期限を7日に変更する処理を実装しています。

 

また、$remember_cookieの名前はAuth::getRecallerNameで取得しています。

public function getRecallerName()
{
    return 'remember_'.$this->name.'_'.sha1(static::class);
}

 

name属性にremember_cookieの名前を指定し、$valueに既存のRemember Cookieから取得した値をセットすることで、Cookieの値を変更することなく期限だけを変更している形です。

 

参考までにテストコードも掲載しておきます。

getMaxAgeメソッドで期限までの秒数(Max Age)を取得しています。

関連記事:Cookieの各属性の意味を分かりやすく解説する

<?php

namespace Tests\Http\Controllers;

use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cookie;
use Illuminate\Support\Facades\Hash;
use Tests\TestCase;

class LoginControllerTest extends TestCase
{
    use DatabaseTransactions;

    /** @test */
    public function remember_meがtrueで認証した後にremember_meの期限を7日に変更できる()
    {
        User::factory()->create([
            'name' => 'testさん',
            'email' => 'test@example.com',
            'password' => Hash::make('test@123'),
        ]);
            
        $this->post('/login', [
            'name' => 'testさん',
            'email' => 'test@example.com',
            'password' => 'test@123',
            // rememberにチェックが入っている
            'remember_me' => true,
        ]);
        $this->assertEquals($seven_days_seconds = 604800, Cookie::queued(Auth::getRecallerName())->getMaxAge());
    }
}

 

おわりに

今回は、LaravelでRemember Meの期限を変更する方法を解説しました。

少しでも参考になっていれば幸いです。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA