Skip to content

Commit e9604a3

Browse files
committed
refactor credentials providers
1 parent d14d8f3 commit e9604a3

36 files changed

+6652
-205
lines changed

alibabacloud_credentials/client.py

Lines changed: 164 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
11
from functools import wraps
22

3-
from alibabacloud_credentials import credentials, providers, models
3+
from alibabacloud_credentials_api import ICredentialsProvider
4+
from alibabacloud_credentials import credentials
5+
from alibabacloud_credentials.exceptions import CredentialException
6+
from alibabacloud_credentials.models import Config, CredentialModel
7+
from alibabacloud_credentials.http import HttpOptions
8+
from alibabacloud_credentials.provider import (StaticAKCredentialsProvider,
9+
StaticSTSCredentialsProvider,
10+
RamRoleArnCredentialsProvider,
11+
OIDCRoleArnCredentialsProvider,
12+
RsaKeyPairCredentialsProvider,
13+
EcsRamRoleCredentialsProvider,
14+
URLCredentialsProvider,
15+
DefaultCredentialsProvider)
416
from alibabacloud_credentials.utils import auth_constant as ac
517
from Tea.decorators import deprecated
618

@@ -16,24 +28,83 @@ def i(*args, **kwargs):
1628
return i
1729

1830

31+
class _CredentialsProviderWrap:
32+
33+
def __init__(self,
34+
*,
35+
type_name: str = None,
36+
provider: ICredentialsProvider = None):
37+
self.type_name = type_name
38+
self.provider = provider
39+
40+
def get_access_key_id(self) -> str:
41+
credential = self.provider.get_credentials()
42+
return credential.get_access_key_id()
43+
44+
async def get_access_key_id_async(self) -> str:
45+
credential = await self.provider.get_credentials_async()
46+
return credential.get_access_key_id()
47+
48+
def get_access_key_secret(self) -> str:
49+
credential = self.provider.get_credentials()
50+
return credential.get_access_key_secret()
51+
52+
async def get_access_key_secret_async(self) -> str:
53+
credential = await self.provider.get_credentials_async()
54+
return credential.get_access_key_secret()
55+
56+
def get_security_token(self):
57+
credential = self.provider.get_credentials()
58+
return credential.get_security_token()
59+
60+
async def get_security_token_async(self):
61+
credential = await self.provider.get_credentials_async()
62+
return credential.get_security_token()
63+
64+
def get_credential(self) -> CredentialModel:
65+
credential = self.provider.get_credentials()
66+
return CredentialModel(
67+
access_key_id=credential.get_access_key_id(),
68+
access_key_secret=credential.get_access_key_secret(),
69+
type=self.type_name,
70+
provider_name=credential.get_provider_name(),
71+
)
72+
73+
async def get_credential_async(self) -> CredentialModel:
74+
credential = await self.provider.get_credentials_async()
75+
return CredentialModel(
76+
access_key_id=credential.get_access_key_id(),
77+
access_key_secret=credential.get_access_key_secret(),
78+
type=self.type_name,
79+
provider_name=credential.get_provider_name(),
80+
)
81+
82+
def get_type(self) -> str:
83+
return self.type_name
84+
85+
1986
class Client:
2087
cloud_credential = None
2188

22-
def __init__(self, config=None):
23-
if config is None:
24-
provider = providers.DefaultCredentialsProvider()
25-
self.cloud_credential = provider.get_credentials()
26-
return
27-
self.cloud_credential = Client.get_credentials(config)
28-
29-
def get_credential(self) -> models.CredentialModel:
89+
def __init__(self,
90+
config: Config = None,
91+
provider: ICredentialsProvider = None):
92+
if provider is not None:
93+
self.cloud_credential = _CredentialsProviderWrap(provider=provider)
94+
elif config is None:
95+
provider = DefaultCredentialsProvider()
96+
self.cloud_credential = _CredentialsProviderWrap(type_name='default', provider=provider)
97+
else:
98+
self.cloud_credential = Client.get_credentials(config)
99+
100+
def get_credential(self) -> CredentialModel:
30101
"""
31102
Get credential
32103
@return: the whole credential
33104
"""
34105
return self.cloud_credential.get_credential()
35106

36-
async def get_credential_async(self) -> models.CredentialModel:
107+
async def get_credential_async(self) -> CredentialModel:
37108
"""
38109
Get credential
39110
@return: the whole credential
@@ -43,44 +114,99 @@ async def get_credential_async(self) -> models.CredentialModel:
43114
@staticmethod
44115
def get_credentials(config):
45116
if config.type == ac.ACCESS_KEY:
46-
return credentials.AccessKeyCredential(config.access_key_id, config.access_key_secret)
117+
provider = StaticAKCredentialsProvider(
118+
access_key_id=config.access_key_id,
119+
access_key_secret=config.access_key_secret,
120+
)
121+
return _CredentialsProviderWrap(type_name='access_key', provider=provider)
47122
elif config.type == ac.STS:
48-
return credentials.StsCredential(config.access_key_id, config.access_key_secret, config.security_token)
123+
provider = StaticSTSCredentialsProvider(
124+
access_key_id=config.access_key_id,
125+
access_key_secret=config.access_key_secret,
126+
security_token=config.security_token,
127+
)
128+
return _CredentialsProviderWrap(type_name='sts', provider=provider)
49129
elif config.type == ac.BEARER:
50130
return credentials.BearerTokenCredential(config.bearer_token)
51131
elif config.type == ac.ECS_RAM_ROLE:
52-
return credentials.EcsRamRoleCredential(
53-
config.access_key_id,
54-
config.access_key_secret,
55-
config.security_token,
56-
0,
57-
providers.EcsRamRoleCredentialProvider(config=config)
132+
provider = EcsRamRoleCredentialsProvider(
133+
role_name=config.role_name,
134+
disable_imds_v1=config.disable_imds_v1,
135+
http_options=HttpOptions(
136+
read_timeout=config.timeout,
137+
connect_timeout=config.connect_timeout,
138+
proxy=config.proxy,
139+
),
58140
)
141+
return _CredentialsProviderWrap(type_name='ecs_ram_role', provider=provider)
59142
elif config.type == ac.CREDENTIALS_URI:
60-
return credentials.CredentialsURICredential(config.credentials_uri)
143+
provider = URLCredentialsProvider(
144+
uri=config.credentials_uri,
145+
http_options=HttpOptions(
146+
read_timeout=config.timeout,
147+
connect_timeout=config.connect_timeout,
148+
proxy=config.proxy,
149+
),
150+
)
151+
return _CredentialsProviderWrap(type_name='credentials_uri', provider=provider)
61152
elif config.type == ac.RAM_ROLE_ARN:
62-
return credentials.RamRoleArnCredential(
63-
config.access_key_id,
64-
config.access_key_secret,
65-
config.security_token,
66-
0,
67-
providers.RamRoleArnCredentialProvider(config=config)
153+
if config.security_token is not None and config.security_token != '':
154+
previous_provider = StaticSTSCredentialsProvider(
155+
access_key_id=config.access_key_id,
156+
access_key_secret=config.access_key_secret,
157+
security_token=config.security_token,
158+
)
159+
else:
160+
previous_provider = StaticAKCredentialsProvider(
161+
access_key_id=config.access_key_id,
162+
access_key_secret=config.access_key_secret,
163+
)
164+
provider = RamRoleArnCredentialsProvider(
165+
credentials_provider=previous_provider,
166+
role_arn=config.role_arn,
167+
role_session_name=config.role_session_name,
168+
duration_seconds=config.role_session_expiration,
169+
policy=config.policy,
170+
external_id=config.external_id,
171+
sts_endpoint=config.sts_endpoint,
172+
http_options=HttpOptions(
173+
read_timeout=config.timeout,
174+
connect_timeout=config.connect_timeout,
175+
proxy=config.proxy,
176+
),
68177
)
178+
return _CredentialsProviderWrap(type_name='ram_role_arn', provider=provider)
69179
elif config.type == ac.RSA_KEY_PAIR:
70-
return credentials.RsaKeyPairCredential(
71-
config.access_key_id,
72-
config.access_key_secret,
73-
0,
74-
providers.RsaKeyPairCredentialProvider(config=config)
180+
provider = RsaKeyPairCredentialsProvider(
181+
public_key_id=config.public_key_id,
182+
private_key_file=config.private_key_file,
183+
duration_seconds=config.role_session_expiration,
184+
sts_endpoint=config.sts_endpoint,
185+
http_options=HttpOptions(
186+
read_timeout=config.timeout,
187+
connect_timeout=config.connect_timeout,
188+
proxy=config.proxy,
189+
),
75190
)
191+
return _CredentialsProviderWrap(type_name='rsa_key_pair', provider=provider)
76192
elif config.type == ac.OIDC_ROLE_ARN:
77-
return credentials.OIDCRoleArnCredential(
78-
config.access_key_id,
79-
config.access_key_secret,
80-
config.security_token,
81-
0,
82-
providers.OIDCRoleArnCredentialProvider(config=config))
83-
return providers.DefaultCredentialsProvider().get_credentials()
193+
provider = OIDCRoleArnCredentialsProvider(
194+
role_arn=config.role_arn,
195+
oidc_provider_arn=config.oidc_provider_arn,
196+
oidc_token_file_path=config.oidc_token_file_path,
197+
role_session_name=config.role_session_name,
198+
duration_seconds=config.role_session_expiration,
199+
policy=config.policy,
200+
sts_endpoint=config.sts_endpoint,
201+
http_options=HttpOptions(
202+
read_timeout=config.timeout,
203+
connect_timeout=config.connect_timeout,
204+
proxy=config.proxy,
205+
),
206+
)
207+
return _CredentialsProviderWrap(type_name='rsa_key_pair', provider=provider)
208+
raise CredentialException(
209+
'invalid type option, support: access_key, sts, bearer, ecs_ram_role, ram_role_arn, rsa_key_pair, oidc_role_arn, credentials_uri')
84210

85211
@deprecated("Use 'get_credential().access_key_id' instead")
86212
def get_access_key_id(self):
@@ -109,7 +235,7 @@ async def get_security_token_async(self):
109235
@deprecated("Use 'get_credential().type' instead")
110236
@attribute_error_return_none
111237
def get_type(self):
112-
return self.cloud_credential.credential_type
238+
return self.cloud_credential.get_type()
113239

114240
@deprecated("Use 'get_credential().bearer_token' instead")
115241
@attribute_error_return_none

alibabacloud_credentials/credentials.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ async def get_credential_async(self):
116116
type=ac.BEARER
117117
)
118118

119+
def get_type(self) -> str:
120+
return self.credential_type
121+
119122

120123
class EcsRamRoleCredential(Credential, _AutomaticallyRefreshCredentials):
121124
"""EcsRamRoleCredential"""
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from ._options import HttpOptions
2+
3+
__all__ = [
4+
'HttpOptions'
5+
]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class HttpOptions:
2+
def __init__(self,
3+
*,
4+
proxy: str = None,
5+
connect_timeout: int = None,
6+
read_timeout: int = None):
7+
self.proxy = proxy
8+
self.connect_timeout = connect_timeout
9+
self.read_timeout = read_timeout

0 commit comments

Comments
 (0)