Skip to content

Commit 25b5197

Browse files
jderusseNyholm
andauthored
Add a persisting cache layer for HTTP credentials (#600)
* Add a persisting cache layer for HTTP credentials * Add Psr Provider and remove default injection * Add example in doc * Apply suggestions * Integrate with Symfony * Fix CS * adjustExpireDate not nullable * Apply suggestions * Cache only expirable credentials Co-authored-by: Tobias Nyholm <[email protected]>
1 parent bba5ccb commit 25b5197

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

src/DependencyInjection/AsyncAwsExtension.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
namespace AsyncAws\Symfony\Bundle\DependencyInjection;
66

7+
use AsyncAws\Core\Credentials\CacheProvider;
8+
use AsyncAws\Core\Credentials\ChainProvider;
9+
use AsyncAws\Core\Credentials\CredentialProvider;
10+
use AsyncAws\Core\Credentials\SymfonyCacheProvider;
711
use AsyncAws\Symfony\Bundle\Secrets\CachedEnvVarLoader;
812
use AsyncAws\Symfony\Bundle\Secrets\SsmVault;
913
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
@@ -93,9 +97,32 @@ private function addServiceDefinition(ContainerBuilder $container, string $name,
9397
$httpClient = new Reference('http_client', ContainerInterface::NULL_ON_INVALID_REFERENCE);
9498
}
9599

100+
if ((null === $credentialServiceId = $config['credential_provider']) && \class_exists(SymfonyCacheProvider::class) && \interface_exists(CacheInterface::class)) {
101+
$credentialServiceId = 'async_aws.credential';
102+
if (!$container->hasDefinition($credentialServiceId)) {
103+
$container->register($credentialServiceId, CredentialProvider::class)
104+
->setFactory([ChainProvider::class, 'createDefaultChain'])
105+
->setArguments([$httpClient, $logger]);
106+
107+
$container->register('async_aws.credential.cache', SymfonyCacheProvider::class)
108+
->setDecoratedService($credentialServiceId)
109+
->setArguments([
110+
new Reference('async_aws.credential.cache.inner'),
111+
new Reference('cache.app'),
112+
]);
113+
114+
$container->register('async_aws.credential.memory', CacheProvider::class)
115+
->setDecoratedService($credentialServiceId)
116+
->setArguments([
117+
new Reference('async_aws.credential.memory.inner'),
118+
new Reference('cache.app'),
119+
]);
120+
}
121+
}
122+
96123
$definition = new Definition($clientClass);
97124
$definition->addArgument($config['config']);
98-
$definition->addArgument(isset($config['credential_provider']) ? new Reference($config['credential_provider']) : null);
125+
$definition->addArgument($credentialServiceId ? new Reference($credentialServiceId) : null);
99126
$definition->addArgument($httpClient);
100127
$definition->addArgument($logger);
101128
$container->setDefinition(sprintf('async_aws.client.%s', $name), $definition);
@@ -145,7 +172,7 @@ private function registerEnvLoader(ContainerBuilder $container, array $config):
145172
throw new InvalidConfigurationException(sprintf('You have enabled "async_aws.secrets.cache" but the "symfony/cache" package is not installed. Try running "composer require symfony/cache"'));
146173
}
147174

148-
$container->Register(CachedEnvVarLoader::class)
175+
$container->register(CachedEnvVarLoader::class)
149176
->setDecoratedService(SsmVault::class)
150177
->setArguments([
151178
new Reference(CachedEnvVarLoader::class . '.inner'),

0 commit comments

Comments
 (0)