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