今回は、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)を取得しています。
<?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の期限を変更する方法を解説しました。
少しでも参考になっていれば幸いです。