123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- <?php
- namespace AlibabaCloud\Credentials\Providers;
- use AlibabaCloud\Credentials\Utils\Filter;
- use AlibabaCloud\Credentials\Utils\Helper;
- use InvalidArgumentException;
- use RuntimeException;
- use Exception;
- /**
- * @internal This class is intended for internal use within the package.
- * Class DefaultCredentialsProvider
- *
- * @package AlibabaCloud\Credentials\Providers
- */
- class DefaultCredentialsProvider implements CredentialsProvider
- {
- /**
- * @var array
- */
- private static $defaultProviders = [];
- /**
- * @var bool
- */
- private $reuseLastProviderEnabled;
- /**
- * @var CredentialsProvider
- */
- private $lastUsedCredentialsProvider;
- /**
- * @var array
- */
- private static $customChain = [];
- /**
- * DefaultCredentialsProvider constructor.
- * @param array $params
- */
- public function __construct(array $params = [])
- {
- $this->filterReuseLastProviderEnabled($params);
- $this->createDefaultChain();
- Filter::reuseLastProviderEnabled($this->reuseLastProviderEnabled);
- }
- private function filterReuseLastProviderEnabled(array $params)
- {
- $this->reuseLastProviderEnabled = true;
- if (isset($params['reuseLastProviderEnabled'])) {
- $this->reuseLastProviderEnabled = $params['reuseLastProviderEnabled'];
- }
- }
- private function createDefaultChain()
- {
- self::$defaultProviders = [
- new EnvironmentVariableCredentialsProvider(),
- ];
- if (
- Helper::envNotEmpty('ALIBABA_CLOUD_ROLE_ARN')
- && Helper::envNotEmpty('ALIBABA_CLOUD_OIDC_PROVIDER_ARN')
- && Helper::envNotEmpty('ALIBABA_CLOUD_OIDC_TOKEN_FILE')
- ) {
- array_push(
- self::$defaultProviders,
- new OIDCRoleArnCredentialsProvider()
- );
- }
- array_push(
- self::$defaultProviders,
- new CLIProfileCredentialsProvider()
- );
- array_push(
- self::$defaultProviders,
- new ProfileCredentialsProvider()
- );
- if (Helper::envNotEmpty('ALIBABA_CLOUD_ECS_METADATA')) {
- array_push(
- self::$defaultProviders,
- new EcsRamRoleCredentialsProvider()
- );
- }
- if (Helper::envNotEmpty('ALIBABA_CLOUD_CREDENTIALS_URI')) {
- array_push(
- self::$defaultProviders,
- new URLCredentialsProvider()
- );
- }
- }
- /**
- * @param CredentialsProvider ...$providers
- */
- public static function set(...$providers)
- {
- if (empty($providers)) {
- throw new InvalidArgumentException('No providers in chain');
- }
- foreach ($providers as $provider) {
- if (!$provider instanceof CredentialsProvider) {
- throw new InvalidArgumentException('Providers must all be CredentialsProvider');
- }
- }
- self::$customChain = $providers;
- }
- /**
- * @return bool
- */
- public static function hasCustomChain()
- {
- return (bool) self::$customChain;
- }
- public static function flush()
- {
- self::$customChain = [];
- }
- /**
- * Get credential.
- *
- * @return Credentials
- * @throws RuntimeException
- */
- public function getCredentials()
- {
- if ($this->reuseLastProviderEnabled && !is_null($this->lastUsedCredentialsProvider)) {
- $credentials = $this->lastUsedCredentialsProvider->getCredentials();
- return new Credentials([
- 'accessKeyId' => $credentials->getAccessKeyId(),
- 'accessKeySecret' => $credentials->getAccessKeySecret(),
- 'securityToken' => $credentials->getSecurityToken(),
- 'providerName' => $this->getProviderName() . '/' . $this->lastUsedCredentialsProvider->getProviderName(),
- ]);
- }
- $providerChain = array_merge(
- self::$customChain,
- self::$defaultProviders
- );
- $exceptionMessages = [];
- foreach ($providerChain as $provider) {
- try {
- $credentials = $provider->getCredentials();
- $this->lastUsedCredentialsProvider = $provider;
- return new Credentials([
- 'accessKeyId' => $credentials->getAccessKeyId(),
- 'accessKeySecret' => $credentials->getAccessKeySecret(),
- 'securityToken' => $credentials->getSecurityToken(),
- 'providerName' => $this->getProviderName() . '/' . $provider->getProviderName(),
- ]);
- } catch (Exception $exception) {
- array_push($exceptionMessages, basename(str_replace('\\', '/', get_class($provider))) . ': ' . $exception->getMessage());
- }
- }
- throw new RuntimeException('Unable to load credentials from any of the providers in the chain: ' . implode(', ', $exceptionMessages));
- }
- /**
- * @inheritDoc
- */
- public function getProviderName()
- {
- return "default";
- }
- }
|