%PDF- %PDF-
| Direktori : /home/bitrix/www/local/php_interface/lib/vendor/kreait/firebase-php/src/Firebase/ |
| Current File : /home/bitrix/www/local/php_interface/lib/vendor/kreait/firebase-php/src/Firebase/Factory.php |
<?php
namespace Kreait\Firebase;
use Firebase\Auth\Token\Cache\InMemoryCache;
use Firebase\Auth\Token\Domain\Generator;
use Firebase\Auth\Token\Generator as CustomTokenGenerator;
use Firebase\Auth\Token\HttpKeyStore;
use Firebase\Auth\Token\Verifier;
use Google\Auth\Credentials\GCECredentials;
use Google\Auth\Credentials\ServiceAccountCredentials;
use Google\Auth\Middleware\AuthTokenMiddleware;
use Google\Cloud\Core\ServiceBuilder;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use function GuzzleHttp\Psr7\uri_for;
use Kreait\Firebase;
use Kreait\Firebase\Auth\CustomTokenViaGoogleIam;
use Kreait\Firebase\Exception\InvalidArgumentException;
use Kreait\Firebase\Exception\RuntimeException;
use Kreait\Firebase\Http\Middleware;
use Kreait\Firebase\ServiceAccount\Discoverer;
use Kreait\GcpMetadata;
use Psr\Http\Message\UriInterface;
class Factory
{
/**
* @var UriInterface
*/
protected $databaseUri;
/**
* @var string
*/
protected $defaultStorageBucket;
/**
* @var ServiceAccount
*/
protected $serviceAccount;
/**
* @var Discoverer
*/
protected $serviceAccountDiscoverer;
/**
* @var string|null
*/
protected $uid;
/**
* @var array
*/
protected $claims = [];
/**
* @var \Psr\SimpleCache\CacheInterface
*/
protected $verifierCache;
/**
* @var array
*/
protected $httpClientConfig = [];
/**
* @var array
*/
protected $httpClientMiddlewares = [];
protected static $databaseUriPattern = 'https://%s.firebaseio.com';
protected static $storageBucketNamePattern = '%s.appspot.com';
public function withServiceAccount(ServiceAccount $serviceAccount): self
{
$factory = clone $this;
$factory->serviceAccount = $serviceAccount;
return $factory;
}
public function withServiceAccountDiscoverer(Discoverer $discoverer): self
{
$factory = clone $this;
$factory->serviceAccountDiscoverer = $discoverer;
return $factory;
}
public function withDatabaseUri($uri): self
{
$factory = clone $this;
$factory->databaseUri = uri_for($uri);
return $factory;
}
public function withDefaultStorageBucket($name): self
{
$factory = clone $this;
$factory->defaultStorageBucket = $name;
return $factory;
}
/**
* @param \Psr\SimpleCache\CacheInterface $cache
*
* @throws \Kreait\Firebase\Exception\InvalidArgumentException
*
* @return self
*/
public function withVerifierCache($cache): self
{
if (!is_a($cache, $expected = 'Psr\SimpleCache\CacheInterface')) {
throw new InvalidArgumentException('The verififier cache must be an instance of '.$expected);
}
$factory = clone $this;
$factory->verifierCache = $cache;
return $factory;
}
public function withHttpClientConfig(array $config): self
{
$factory = clone $this;
$factory->httpClientConfig = $config;
return $factory;
}
public function withHttpClientMiddlewares(array $middlewares): self
{
$factory = clone $this;
$factory->httpClientMiddlewares = $middlewares;
return $factory;
}
public function asUser(string $uid, array $claims = null): self
{
$factory = clone $this;
$factory->uid = $uid;
$factory->claims = $claims ?? [];
return $factory;
}
public function create(): Firebase
{
$database = $this->createDatabase();
$auth = $this->createAuth();
$storage = $this->createStorage();
$remoteConfig = $this->createRemoteConfig();
$messaging = $this->createMessaging();
return new Firebase($database, $auth, $storage, $remoteConfig, $messaging);
}
protected function getServiceAccountDiscoverer(): Discoverer
{
return $this->serviceAccountDiscoverer ?? new Discoverer();
}
protected function getServiceAccount(): ServiceAccount
{
if (!$this->serviceAccount) {
$this->serviceAccount = $this->getServiceAccountDiscoverer()->discover();
}
return $this->serviceAccount;
}
protected function getDatabaseUri(): UriInterface
{
return $this->databaseUri ?: $this->getDatabaseUriFromServiceAccount($this->getServiceAccount());
}
protected function getStorageBucketName(): string
{
return $this->defaultStorageBucket ?: $this->getStorageBucketNameFromServiceAccount($this->getServiceAccount());
}
protected function getDatabaseUriFromServiceAccount(ServiceAccount $serviceAccount): UriInterface
{
return uri_for(sprintf(self::$databaseUriPattern, $serviceAccount->getSanitizedProjectId()));
}
protected function getStorageBucketNameFromServiceAccount(ServiceAccount $serviceAccount): string
{
return sprintf(self::$storageBucketNamePattern, $serviceAccount->getSanitizedProjectId());
}
protected function createAuth(): Auth
{
$http = $this->createApiClient([
'base_uri' => 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/',
]);
$apiClient = new Auth\ApiClient($http);
$serviceAccount = $this->getServiceAccount();
$customTokenGenerator = $this->createCustomTokenGenerator();
$keyStore = new HttpKeyStore(new Client(), $this->verifierCache ?: new InMemoryCache());
$verifier = new Verifier($serviceAccount->getSanitizedProjectId(), $keyStore);
return new Auth($apiClient, $customTokenGenerator, $verifier);
}
public function createCustomTokenGenerator(): Generator
{
$serviceAccount = $this->getServiceAccount();
if ($serviceAccount->hasPrivateKey()) {
return new CustomTokenGenerator($serviceAccount->getClientEmail(), $serviceAccount->getPrivateKey());
}
$http = $this->createApiClient(null, ['https://www.googleapis.com/auth/iam']);
return new CustomTokenViaGoogleIam($serviceAccount->getClientEmail(), $http);
}
protected function createDatabase(): Database
{
$http = $this->createApiClient();
$middlewares = [
'json_suffix' => Firebase\Http\Middleware::ensureJsonSuffix(),
];
if ($this->uid) {
$authOverride = new Http\Auth\CustomToken($this->uid, $this->claims);
$middlewares['auth_override'] = Middleware::overrideAuth($authOverride);
}
/** @var HandlerStack $handler */
$handler = $http->getConfig('handler');
foreach ($middlewares as $name => $middleware) {
$handler->push($middleware, $name);
}
return new Database($this->getDatabaseUri(), new Database\ApiClient($http));
}
protected function createRemoteConfig(): RemoteConfig
{
$http = $this->createApiClient([
'base_uri' => 'https://firebaseremoteconfig.googleapis.com/v1/projects/'.$this->getServiceAccount()->getSanitizedProjectId().'/remoteConfig',
]);
return new RemoteConfig(new RemoteConfig\ApiClient($http));
}
protected function createMessaging(): Messaging
{
$serviceAccount = $this->getServiceAccount();
$projectId = $serviceAccount->getSanitizedProjectId();
$messagingApiClient = new Messaging\ApiClient(
$this->createApiClient([
'base_uri' => 'https://fcm.googleapis.com/v1/projects/'.$projectId,
])
);
$topicManagementApiClient = new Messaging\TopicManagementApiClient(
$this->createApiClient([
'base_uri' => 'https://iid.googleapis.com',
'headers' => [
'access_token_auth' => 'true',
],
])
);
return new Messaging($messagingApiClient, $topicManagementApiClient);
}
public function createApiClient(array $config = null, array $additionalScopes = null): Client
{
$config = $config ?? [];
$additionalScopes = $additionalScopes ?? [];
$googleAuthTokenMiddleware = $this->createGoogleAuthTokenMiddleware($additionalScopes);
$stack = HandlerStack::create();
foreach ($this->httpClientMiddlewares as $middleware) {
$stack->push($middleware);
}
$stack->push($googleAuthTokenMiddleware);
$config = array_merge(
$this->httpClientConfig,
$config ?? [],
[
'handler' => $stack,
'auth' => 'google_auth',
]
);
return new Client($config);
}
protected function createGoogleAuthTokenMiddleware(array $additionalScopes = null): AuthTokenMiddleware
{
$serviceAccount = $this->getServiceAccount();
$scopes = [
'https://www.googleapis.com/auth/cloud-platform',
'https://www.googleapis.com/auth/firebase',
'https://www.googleapis.com/auth/firebase.database',
'https://www.googleapis.com/auth/firebase.messaging',
'https://www.googleapis.com/auth/firebase.remoteconfig',
'https://www.googleapis.com/auth/userinfo.email',
] + ($additionalScopes ?? []);
if ($serviceAccount->hasClientId() && $serviceAccount->hasPrivateKey()) {
$credentials = new ServiceAccountCredentials($scopes, [
'client_email' => $serviceAccount->getClientEmail(),
'client_id' => $serviceAccount->getClientId(),
'private_key' => $serviceAccount->getPrivateKey(),
]);
} elseif ((new GcpMetadata())->isAvailable()) {
$credentials = new GCECredentials();
} else {
throw new RuntimeException('Unable to determine credentials.');
}
return new AuthTokenMiddleware($credentials);
}
protected function createStorage(): Storage
{
$builder = $this->getGoogleCloudServiceBuilder();
$storageClient = $builder->storage([
'projectId' => $this->getServiceAccount()->getSanitizedProjectId(),
]);
return new Storage($storageClient, $this->getStorageBucketName());
}
protected function getGoogleCloudServiceBuilder(): ServiceBuilder
{
$serviceAccount = $this->getServiceAccount();
$config = [
'projectId' => $serviceAccount->getProjectId(),
];
if ($serviceAccount->hasClientId() && $serviceAccount->hasPrivateKey()) {
$config = [
'keyFile' => [
'client_email' => $serviceAccount->getClientEmail(),
'client_id' => $serviceAccount->getClientId(),
'private_key' => $serviceAccount->getPrivateKey(),
'type' => 'service_account',
],
];
}
return new ServiceBuilder($config);
}
}