67 lines
1.8 KiB
PHP
67 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace Lexik\Bundle\JWTAuthenticationBundle\Services\BlockedToken;
|
|
|
|
use DateInterval;
|
|
use DateTimeImmutable;
|
|
use DateTimeZone;
|
|
use Lexik\Bundle\JWTAuthenticationBundle\Exception\MissingClaimException;
|
|
use Lexik\Bundle\JWTAuthenticationBundle\Services\BlockedTokenManagerInterface;
|
|
use Psr\Cache\CacheItemPoolInterface;
|
|
|
|
class CacheItemPoolBlockedTokenManager implements BlockedTokenManagerInterface
|
|
{
|
|
private $cacheJwt;
|
|
|
|
public function __construct(CacheItemPoolInterface $cacheJwt)
|
|
{
|
|
$this->cacheJwt = $cacheJwt;
|
|
}
|
|
|
|
public function add(array $payload): bool
|
|
{
|
|
if (!isset($payload['exp'])) {
|
|
throw new MissingClaimException('exp');
|
|
}
|
|
|
|
$expiration = new DateTimeImmutable('@' . $payload['exp'], new DateTimeZone('UTC'));
|
|
$now = new DateTimeImmutable('now', new DateTimeZone('UTC'));
|
|
|
|
// If the token is already expired, there's no point in adding it to storage
|
|
if ($expiration <= $now) {
|
|
return false;
|
|
}
|
|
|
|
$cacheExpiration = $expiration->add(new DateInterval('PT5M'));
|
|
|
|
if (!isset($payload['jti'])) {
|
|
throw new MissingClaimException('jti');
|
|
}
|
|
|
|
$cacheItem = $this->cacheJwt->getItem($payload['jti']);
|
|
$cacheItem->set([]);
|
|
$cacheItem->expiresAt($cacheExpiration);
|
|
$this->cacheJwt->save($cacheItem);
|
|
|
|
return true;
|
|
}
|
|
|
|
public function has(array $payload): bool
|
|
{
|
|
if (!isset($payload['jti'])) {
|
|
throw new MissingClaimException('jti');
|
|
}
|
|
|
|
return $this->cacheJwt->hasItem($payload['jti']);
|
|
}
|
|
|
|
public function remove(array $payload): void
|
|
{
|
|
if (!isset($payload['jti'])) {
|
|
throw new MissingClaimException('jti');
|
|
}
|
|
|
|
$this->cacheJwt->deleteItem($payload['jti']);
|
|
}
|
|
}
|