[英]Laravel Sanctum token expiration based on last usage
我已经在配置文件中设置了 sanctum 令牌过期时间,比如说 24 小时:
/*
|--------------------------------------------------------------------------
| Expiration Minutes
|--------------------------------------------------------------------------
|
| This value controls the number of minutes until an issued token will be
| considered expired. If this value is null, personal access tokens do
| not expire. This won't tweak the lifetime of first-party sessions.
|
*/
'expiration' => 24 * 60,
这样做,我的令牌在这段时间之后变得无效。 相反,我想做的是根据令牌的 last_used_at 属性检查此过期时间。
为了更好地理解这里是一个简单的例子:
在对源文件进行了一些挖掘之后,我找到了 Guard,它会进行这项检查。
供应商/laravel/sanctum/src/Guard.php
protected function isValidAccessToken($accessToken): bool
{
if (! $accessToken) {
return false;
}
$isValid =
(! $this->expiration || $accessToken->created_at->gt(now()->subMinutes($this->expiration)))
&& $this->hasValidProvider($accessToken->tokenable);
if (is_callable(Sanctum::$accessTokenAuthenticationCallback)) {
$isValid = (bool) (Sanctum::$accessTokenAuthenticationCallback)($accessToken, $isValid);
}
return $isValid;
}
我认为,将 created_at 更改为 last_used_at 将完全符合我的需要,但问题是如何做到这一点? 当然,我不想编辑供应商文件。
到目前为止我已经尝试过:
您可以更新圣所守卫:
"extra": {
"laravel": {
"dont-discover": [
"Laravel\\Sanctum\\SanctumServiceProvider"
]
}
},
php artisan make:provider ExtendedSanctumServiceProvider
<?php
namespace App\Providers;
use App\Guards\SanctumGuard;
use Illuminate\Auth\RequestGuard;
use Illuminate\Support\Facades\Log;
use Laravel\Sanctum\SanctumServiceProvider;
class ExtendedSanctumServiceProvider extends SanctumServiceProvider
{
/**
* Register the guard.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @param array $config
* @return RequestGuard
*/
protected function createGuard($auth, $config)
{
return new RequestGuard(
new SanctumGuard($auth, config('sanctum.expiration'), $config['provider']),
request(),
$auth->createUserProvider($config['provider'] ?? null)
);
}
}
<?php
namespace App\Guards;
use Laravel\Sanctum\Guard as BaseSanctumGuard;
use Laravel\Sanctum\Sanctum;
class SanctumGuard extends BaseSanctumGuard
{
/**
* Determine if the provided access token is valid.
*
* @param mixed $accessToken
* @return bool
*/
protected function isValidAccessToken($accessToken): bool
{
if (! $accessToken) {
return false;
}
$last_used_at = $accessToken->last_used_at;
if(!$last_used_at) $last_used_at = $accessToken->created_at;
$isValid =
(! $this->expiration || $last_used_at->gt(now()->subMinutes($this->expiration)))
&& $this->hasValidProvider($accessToken->tokenable);
if (is_callable(Sanctum::$accessTokenAuthenticationCallback)) {
$isValid = (bool) (Sanctum::$accessTokenAuthenticationCallback)($accessToken, $isValid);
}
return $isValid;
}
}
/*
* Application Service Providers...
*/
...
App\Providers\AppServiceProvider::class,
App\Providers\ExtendedSanctumServiceProvider::class,
.
.
.
有了这一切,你准备好了 go
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.