Под сеансом я имел ввиду активный refresh token.
Хотелось бы установить ограничение на 5 сеансов.
То есть, пользователь залогинился с 5 разных браузеров/устройств и т. д., на 6 логин мы удаляем все предыдущие сессии - в первую очередь refresh tokens, а access все равно потухнут сами через 30 минут, но можно и удалить вручную.
Сейчас это реализовано так, но криво:
namespace App\Listeners;
use App\Models\User;
use Laravel\Passport\Events\AccessTokenCreated;
use Laravel\Passport\Token;
use Laravel\Passport\TokenRepository;
use Laravel\Passport\RefreshTokenRepository;
class RevokeOldTokens
{
public function handle(AccessTokenCreated $event)
{
$accessTokens = Token::query()->where('user_id', $event->userId)->where('revoked', 0)->where('id', '!=', $event->tokenId)->get();
if(count($accessTokens) >= User::MAX_SEANS) {
$tokenRepository = app(TokenRepository::class);
$refreshTokenRepository = app(RefreshTokenRepository::class);
foreach ($accessTokens as $accessToken) {
$tokenRepository->revokeAccessToken($accessToken->id);
$refreshTokenRepository->revokeRefreshTokensByAccessTokenId($accessToken->id);
}
}
}
}
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
'Laravel\Passport\Events\AccessTokenCreated' => [
'App\Listeners\RevokeOldTokens',
],
'Laravel\Passport\Events\RefreshTokenCreated' => [
//'App\Listeners\PruneOldTokens',
],
ProjectCreatedEvent::class => [
ProjectSlugListener::class,
],
];
}
Основная проблема: выкидывает из админки периодически - пока не очень понял, почему (такое ощущение, что удаляется что-то лишнее).
Как можно правильно реализовать подобную задачу?