%PDF- %PDF-
Direktori : /home/bitrix/www/local/php_interface/lib/vendor/kreait/firebase-tokens/src/ |
Current File : //home/bitrix/www/local/php_interface/lib/vendor/kreait/firebase-tokens/src/Verifier.php |
<?php namespace Firebase\Auth\Token; use Firebase\Auth\Token\Domain\KeyStore; use Firebase\Auth\Token\Exception\ExpiredToken; use Firebase\Auth\Token\Exception\InvalidSignature; use Firebase\Auth\Token\Exception\InvalidToken; use Firebase\Auth\Token\Exception\IssuedInTheFuture; use Firebase\Auth\Token\Exception\UnknownKey; use Lcobucci\JWT\Parser; use Lcobucci\JWT\Signer; use Lcobucci\JWT\Signer\Rsa\Sha256; use Lcobucci\JWT\Token; final class Verifier implements Domain\Verifier { /** * @var string */ private $projectId; /** * @var KeyStore */ private $keys; /** * @var Signer */ private $signer; public function __construct(string $projectId, KeyStore $keys = null, Signer $signer = null) { $this->projectId = $projectId; $this->keys = $keys ?? new HttpKeyStore(); $this->signer = $signer ?? new Sha256(); } public function verifyIdToken($token): Token { if (!($token instanceof Token)) { $token = (new Parser())->parse($token); } $errorBeforeSignatureCheck = null; try { $this->verifyExpiry($token); $this->verifyAuthTime($token); $this->verifyIssuedAt($token); $this->verifyIssuer($token); } catch (\Throwable $e) { $errorBeforeSignatureCheck = $e; } $this->verifySignature($token, $this->getKey($token)); if ($errorBeforeSignatureCheck) { throw $errorBeforeSignatureCheck; } return $token; } private function verifyExpiry(Token $token) { if (!$token->hasClaim('exp')) { throw new InvalidToken($token, 'The claim "exp" is missing.'); } if ($token->isExpired()) { throw new ExpiredToken($token); } } private function verifyAuthTime(Token $token) { if (!$token->hasClaim('auth_time')) { throw new InvalidToken($token, 'The claim "auth_time" is missing.'); } if ($token->getClaim('auth_time') > time()) { throw new InvalidToken($token, "The user's authentication time must be in the past"); } } private function verifyIssuedAt(Token $token) { if (!$token->hasClaim('iat')) { throw new InvalidToken($token, 'The claim "iat" is missing.'); } if ($token->getClaim('iat') > time()) { throw new IssuedInTheFuture($token); } } private function verifyIssuer(Token $token) { if (!$token->hasClaim('iss')) { throw new InvalidToken($token, 'The claim "iss" is missing.'); } if ($token->getClaim('iss') !== sprintf('https://securetoken.google.com/%s', $this->projectId)) { throw new InvalidToken($token, 'This token has an invalid issuer.'); } } private function getKey(Token $token): string { if (!$token->hasHeader('kid')) { throw new InvalidToken($token, 'The header "kid" is missing.'); } $keyId = $token->getHeader('kid'); try { return $this->keys->get($keyId); } catch (\OutOfBoundsException $e) { throw new UnknownKey($keyId); } } private function verifySignature(Token $token, string $key) { try { $isVerified = $token->verify($this->signer, $key); } catch (\Throwable $e) { throw new InvalidSignature($token, $e->getMessage()); } if (!$isVerified) { throw new InvalidSignature($token); } } }