%PDF- %PDF-
| Direktori : /home/graphicd/www/vebto/vendor/kreait/firebase-tokens/src/Firebase/Auth/Token/ |
| Current File : /home/graphicd/www/vebto/vendor/kreait/firebase-tokens/src/Firebase/Auth/Token/HttpKeyStore.php |
<?php
declare(strict_types=1);
namespace Firebase\Auth\Token;
use Fig\Http\Message\RequestMethodInterface as RequestMethod;
use Firebase\Auth\Token\Cache\InMemoryCache;
use Firebase\Auth\Token\Domain\KeyStore;
use GuzzleHttp\Client;
use GuzzleHttp\ClientInterface;
use OutOfBoundsException;
use Psr\SimpleCache\CacheInterface;
/**
* @see https://firebase.google.com/docs/auth/admin/verify-id-tokens#verify_id_tokens_using_a_third-party_jwt_library
*/
final class HttpKeyStore implements KeyStore
{
/** @deprecated 1.15.0 */
const KEYS_URL = 'https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com';
const KEY_URLS = [
'https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com',
'https://www.googleapis.com/oauth2/v1/certs',
];
/** @var ClientInterface */
private $client;
/** @var CacheInterface */
private $cache;
/**
* @deprecated 1.9.0
*/
public function __construct(ClientInterface $client = null, CacheInterface $cache = null)
{
$this->client = $client ?? new Client();
$this->cache = $cache ?? new InMemoryCache();
}
public function get($keyId)
{
$keys = $this->fetchKeys();
if (isset($keys[$keyId])) {
return $keys[$keyId];
}
throw new OutOfBoundsException(\sprintf('Key with ID "%s" not found.', $keyId));
}
/**
* @return array<string, string>
*/
private function fetchKeys(): array
{
$cacheKey = \md5(__CLASS__).'_keys';
$keys = $this->cache->get($cacheKey, null);
if (\is_array($keys) && \count($keys) >= 1) {
return $keys;
}
$keys = [];
$ttls = [];
foreach (self::KEY_URLS as $url) {
$result = $this->fetchKeysFromUrl($url);
$keys[] = $result['keys'];
$ttls[] = $result['ttl'];
}
$keys = \array_merge(...$keys);
$ttl = \min($ttls);
$this->cache->set($cacheKey, $keys, $ttl);
return $keys;
}
/**
* @return array{
* keys: array<string, string>,
* ttl: int
* }
*/
private function fetchKeysFromUrl(string $url): array
{
$response = $this->client->request(RequestMethod::METHOD_GET, $url);
$ttl = \preg_match('/max-age=(\d+)/i', $response->getHeaderLine('Cache-Control') ?? '', $matches)
? (int) $matches[1]
: 0;
$keys = \json_decode((string) $response->getBody(), true);
return [
'keys' => $keys,
'ttl' => $ttl,
];
}
}