default.py 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from . import EnvironmentVariableCredentialsProvider, EcsRamRoleCredentialsProvider, \
  2. OIDCRoleArnCredentialsProvider, URLCredentialsProvider, CLIProfileCredentialsProvider, ProfileCredentialsProvider
  3. from alibabacloud_credentials.provider.refreshable import Credentials
  4. from alibabacloud_credentials_api import ICredentialsProvider
  5. from alibabacloud_credentials.utils import auth_util as au
  6. from alibabacloud_credentials.exceptions import CredentialException
  7. class DefaultCredentialsProvider(ICredentialsProvider):
  8. def __init__(self, *,
  9. reuse_last_provider_enabled: bool = True):
  10. self.__reuse_last_provider_enabled = reuse_last_provider_enabled
  11. self.__last_used_provider = None
  12. self.__providers_chain = [
  13. EnvironmentVariableCredentialsProvider()
  14. ]
  15. if au.enable_oidc_credential:
  16. self.__providers_chain.append(OIDCRoleArnCredentialsProvider())
  17. self.__providers_chain.append(CLIProfileCredentialsProvider())
  18. self.__providers_chain.append(ProfileCredentialsProvider())
  19. if au.environment_ecs_metadata_disabled.lower() != 'true':
  20. self.__providers_chain.append(EcsRamRoleCredentialsProvider())
  21. if au.environment_credentials_uri is not None and au.environment_credentials_uri != '':
  22. self.__providers_chain.append(URLCredentialsProvider())
  23. def get_credentials(self) -> Credentials:
  24. if self.__reuse_last_provider_enabled and self.__last_used_provider is not None:
  25. credentials = self.__last_used_provider.get_credentials()
  26. return Credentials(
  27. access_key_id=credentials.get_access_key_id(),
  28. access_key_secret=credentials.get_access_key_secret(),
  29. security_token=credentials.get_security_token(),
  30. provider_name=f'{self.get_provider_name()}/{credentials.get_provider_name()}'
  31. )
  32. error_messages = []
  33. for provider in self.__providers_chain:
  34. try:
  35. credentials = provider.get_credentials()
  36. if credentials is not None:
  37. self.__last_used_provider = provider
  38. return Credentials(
  39. access_key_id=credentials.get_access_key_id(),
  40. access_key_secret=credentials.get_access_key_secret(),
  41. security_token=credentials.get_security_token(),
  42. provider_name=f'{self.get_provider_name()}/{credentials.get_provider_name()}'
  43. )
  44. except Exception as e:
  45. error_messages.append(f'{type(provider).__name__}: {str(e)}')
  46. raise CredentialException(
  47. f'unable to load credentials from any of the providers in the chain: {error_messages}')
  48. async def get_credentials_async(self) -> Credentials:
  49. if self.__reuse_last_provider_enabled and self.__last_used_provider is not None:
  50. credentials = await self.__last_used_provider.get_credentials_async()
  51. return Credentials(
  52. access_key_id=credentials.get_access_key_id(),
  53. access_key_secret=credentials.get_access_key_secret(),
  54. security_token=credentials.get_security_token(),
  55. provider_name=f'{self.get_provider_name()}/{credentials.get_provider_name()}'
  56. )
  57. error_messages = []
  58. for provider in self.__providers_chain:
  59. try:
  60. credentials = await provider.get_credentials_async()
  61. if credentials is not None:
  62. self.__last_used_provider = provider
  63. return Credentials(
  64. access_key_id=credentials.get_access_key_id(),
  65. access_key_secret=credentials.get_access_key_secret(),
  66. security_token=credentials.get_security_token(),
  67. provider_name=f'{self.get_provider_name()}/{credentials.get_provider_name()}'
  68. )
  69. except Exception as e:
  70. error_messages.append(f'{type(provider).__name__}: {str(e)}')
  71. raise CredentialException(
  72. f'unable to load credentials from any of the providers in the chain: {error_messages}')
  73. def get_provider_name(self) -> str:
  74. return 'default'