Skip to content

Commit 7877feb

Browse files
author
71J2M74-RWI\Admin
committed
新增兼容assumeRole + assumeRoleWithOidc + assumeRoleWithSaml的代码提交,以及具体调用方式在SDK.md
1 parent 23743ba commit 7877feb

File tree

8 files changed

+363
-2
lines changed

8 files changed

+363
-2
lines changed

SDK_Integration_zh.md

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
- [访问凭据](#访问凭据)
66
- [AK、SK设置](#aksk设置)
77
- [STS Token设置](#sts-token设置)
8+
- [STS AssumeRole示例](#sts-assumerole示例)
9+
- [STS AssumeRoleWithOidc示例](#sts-assumerolewithoidc示例)
10+
- [STS AssumeRoleWithSaml示例](#sts-assumerolewithsaml示例)
811
- [EndPoint配置](#endpoint配置)
912
- [自定义Endpoint](#自定义endpoint)
1013
- [自定义RegionId](#自定义regionid)
@@ -133,8 +136,170 @@ try:
133136
except ApiException as e:
134137
pass
135138
```
139+
## STS AssumeRole示例
136140

141+
STS AssumeRole(Security Token Service)是火山引擎提供的临时访问凭证机制。开发者通过服务端调用 STS 接口获取临时凭证(临时 AK、SK 和 Token),有效期可配置,适用于安全要求较高的场景。
142+
<br>
143+
此接口使用IAM子账号角色进行 AssumeRole 操作后,获取到IAM子用户的信息后,发起真正的API请求,参考如下
144+
<br>
145+
连接地址:https://www.volcengine.com/docs/6257/86374
146+
> ⚠️ 注意事项
147+
>
148+
> 1. 最小权限: 仅授予调用方访问所需资源的最小权限,避免使用 * 通配符授予全资源、全操作权限。
149+
> 2. 设置合理的有效期: 请根据实际情况设置合理有效期,越短越安全,建议不要超过1小时。
150+
151+
支持`configuration`级别全局配置和接口级别的运行时参数设置`RuntimeOption`;`RuntimeOption`设置会覆盖`configuration`全局配置。
137152

153+
**代码示例:**
154+
```python
155+
from __future__ import print_function
156+
import volcenginesdkcore
157+
import volcenginesdkvpc
158+
from volcenginesdkcore.rest import ApiException
159+
from volcenginesdkcore.auth.providers.sts_provider import StsCredentialProvider
160+
161+
if __name__ == '__main__':
162+
# 注意示例代码安全,代码泄漏会导致AK/SK泄漏,有极大的安全风险。
163+
configuration = volcenginesdkcore.Configuration()
164+
configuration.region = "cn-beijing"
165+
166+
# 这里是使用STS ASSUMEROLE角色的方式
167+
configuration.credential_provider = StsCredentialProvider(
168+
ak="Your ak",
169+
sk="Your sk",
170+
role_name="Your role name",
171+
account_id="Your account id",
172+
region="cn-beijing"
173+
)
174+
175+
# set default configuration
176+
volcenginesdkcore.Configuration.set_default(configuration)
177+
# use global default configuration
178+
api_instance = volcenginesdkvpc.VPCApi()
179+
create_vpc_request = volcenginesdkvpc.CreateVpcRequest(
180+
cidr_block="192.168.0.0/16",
181+
dns_servers=["10.0.0.1", "10.1.1.2"],
182+
)
183+
184+
try:
185+
# 复制代码运行示例,请自行打印API返回值。
186+
api_instance.create_vpc(create_vpc_request)
187+
except ApiException as e:
188+
# 复制代码运行示例,请自行打印API错误信息。
189+
# print("Exception when calling api: %s\n" % e)
190+
pass
191+
```
192+
193+
## STS AssumeRoleWithOidc示例
194+
195+
STS AssumeRoleOIDC(Security Token Service)是火山引擎提供的临时访问凭证机制。开发者通过oidc_token在服务端调用 STS 接口获取临时凭证(临时 AK、SK 和 Token),有效期可配置,适用于安全要求较高的场景。
196+
<br>
197+
此接口使用oidc身份提供商角色使用oidc_token进行 AssumeRoleWithOidc 操作后,获取到用户的信息后,发起真正的API请求,参考如下
198+
<br>
199+
连接地址:https://www.volcengine.com/docs/6257/1494877
200+
> ⚠️ 注意事项
201+
>
202+
> 1. 最小权限: 仅授予调用方访问所需资源的最小权限,避免使用 * 通配符授予全资源、全操作权限。
203+
> 2. 设置合理的有效期: 请根据实际情况设置合理有效期,越短越安全,建议不要超过1小时。
204+
205+
支持`configuration`级别全局配置和接口级别的运行时参数设置`RuntimeOption`;`RuntimeOption`设置会覆盖`configuration`全局配置。
206+
207+
**代码示例:**
208+
```python
209+
# Example Code generated by Beijing Volcanoengine Technology.
210+
from __future__ import print_function
211+
import volcenginesdkcore
212+
import volcenginesdkvpc
213+
from volcenginesdkcore.rest import ApiException
214+
from volcenginesdkcore.auth.providers.sts_oidc_provider import StsOidcCredentialProvider
215+
216+
if __name__ == '__main__':
217+
# 注意示例代码安全,代码泄漏会导致AK/SK泄漏,有极大的安全风险。
218+
configuration = volcenginesdkcore.Configuration()
219+
configuration.region = "cn-beijing"
220+
221+
# 这里是使用STS ASSUMEROLE_OIDC角色的方式
222+
configuration.credential_provider = StsOidcCredentialProvider(
223+
role_name="your role name",
224+
account_id="your account id",
225+
oidc_token="your oidc token",
226+
region="cn-beijing"
227+
)
228+
229+
# set default configuration
230+
volcenginesdkcore.Configuration.set_default(configuration)
231+
# use global default configuration
232+
api_instance = volcenginesdkvpc.VPCApi()
233+
create_vpc_request = volcenginesdkvpc.CreateVpcRequest(
234+
cidr_block="192.168.0.0/16",
235+
dns_servers=["10.0.0.1", "10.1.1.2"],
236+
)
237+
238+
try:
239+
# 复制代码运行示例,请自行打印API返回值。
240+
api_instance.create_vpc(create_vpc_request)
241+
except ApiException as e:
242+
# 复制代码运行示例,请自行打印API错误信息。
243+
# print("Exception when calling api: %s\n" % e)
244+
pass
245+
246+
```
247+
248+
## STS AssumeRoleWithSaml示例
249+
250+
STS AssumeRoleWithSaml(Security Token Service)是火山引擎提供的临时访问凭证机制。开发者通过saml_token在服务端调用 STS 接口获取临时凭证(临时 AK、SK 和 Token),有效期可配置,适用于安全要求较高的场景。
251+
<br>
252+
此接口使用saml身份提供商角色使用saml_resp进行 AssumeRoleWithSaml 操作后,获取到用户的信息后,发起真正的API请求,参考如下
253+
<br>
254+
连接地址:https://www.volcengine.com/docs/6257/1631607
255+
> ⚠️ 注意事项
256+
>
257+
> 1. 最小权限: 仅授予调用方访问所需资源的最小权限,避免使用 * 通配符授予全资源、全操作权限。
258+
> 2. 设置合理的有效期: 请根据实际情况设置合理有效期,越短越安全,建议不要超过1小时。
259+
260+
支持`configuration`级别全局配置和接口级别的运行时参数设置`RuntimeOption`;`RuntimeOption`设置会覆盖`configuration`全局配置。
261+
262+
**代码示例:**
263+
```python
264+
# Example Code generated by Beijing Volcanoengine Technology.
265+
from __future__ import print_function
266+
import volcenginesdkcore
267+
import volcenginesdkvpc
268+
from volcenginesdkcore.rest import ApiException
269+
from volcenginesdkcore.auth.providers.sts_saml_provider import StsSamlCredentialProvider
270+
271+
if __name__ == '__main__':
272+
# 注意示例代码安全,代码泄漏会导致AK/SK泄漏,有极大的安全风险。
273+
configuration = volcenginesdkcore.Configuration()
274+
configuration.region = "cn-beijing"
275+
276+
# 这里是使用STS ASSUMEROLE_SAML角色的方式
277+
configuration.credential_provider = StsSamlCredentialProvider(
278+
role_name="your role name",
279+
provider_name="your provider name",
280+
account_id="your account id",
281+
saml_resp="your saml resp",
282+
region="cn-beijing"
283+
)
284+
285+
# set default configuration
286+
volcenginesdkcore.Configuration.set_default(configuration)
287+
# use global default configuration
288+
api_instance = volcenginesdkvpc.VPCApi()
289+
create_vpc_request = volcenginesdkvpc.CreateVpcRequest(
290+
cidr_block="192.168.0.0/16",
291+
dns_servers=["10.0.0.1", "10.1.1.2"],
292+
)
293+
294+
try:
295+
# 复制代码运行示例,请自行打印API返回值。
296+
api_instance.create_vpc(create_vpc_request)
297+
except ApiException as e:
298+
# 复制代码运行示例,请自行打印API错误信息。
299+
# print("Exception when calling api: %s\n" % e)
300+
pass
301+
302+
```
138303

139304
# EndPoint配置
140305

volcenginesdkcore/api_client.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ def __call_api(
115115
if self.cookie:
116116
header_params['Cookie'] = self.cookie
117117

118+
# 新增代码。处理assume_role和assume_role_oidc和assume_role_saml
119+
if self.configuration.credential_provider is not None:
120+
self.configuration.credential_provider.refresh() # 这会调用 _assume_role_oidc() 方法获取临时凭证
121+
credentials = self.configuration.credential_provider.retrieve()
122+
self.configuration.ak = credentials.ak
123+
self.configuration.sk = credentials.sk
124+
self.configuration.session_token = credentials.session_token
125+
118126
interceptor_context = InterceptorContext(request=Request(
119127
self.configuration,
120128
resource_path, method, path_params,

volcenginesdkcore/auth/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
from .credential import Credential
2-
from .providers import StsCredentialProvider, StaticCredentialProvider
2+
from .providers import StsCredentialProvider, StsOidcCredentialProvider,StaticCredentialProvider
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
from .static_provider import StaticCredentialProvider
22
from .sts_provider import StsCredentialProvider
3+
from .sts_oidc_provider import StsOidcCredentialProvider
4+
from .sts_saml_provider import StsSamlCredentialProvider
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import threading
2+
import time
3+
import uuid
4+
from datetime import datetime
5+
6+
import dateutil.parser
7+
8+
from volcenginesdkcore import UniversalApi, UniversalInfo, ApiClient, Configuration
9+
from .provider import Provider, CredentialValue
10+
11+
12+
class AssumeRoleOidcCredentials:
13+
def __init__(self, ak, sk, session_token, current_time, expired_time):
14+
self.ak = ak
15+
self.sk = sk
16+
self.session_token = session_token
17+
self.current_time = current_time
18+
self.expired_time = expired_time
19+
20+
21+
class StsOidcCredentialProvider(Provider):
22+
def __init__(self, role_name, oidc_token, account_id, duration_seconds=3600, scheme='https',
23+
host='sts.volcengineapi.com', region='cn-north-1', timeout=30, expired_buffer_seconds=60):
24+
25+
self.role_name = role_name
26+
self.account_id = account_id
27+
self.oidc_token = oidc_token
28+
29+
self.timeout = timeout
30+
self.duration_seconds = duration_seconds
31+
32+
self.host = host
33+
self.region = region
34+
self.scheme = scheme
35+
36+
self.expired_time = None
37+
if expired_buffer_seconds > 600:
38+
raise ValueError('expired_buffer_seconds must be less than or equal to 600')
39+
self.expired_buffer_seconds = expired_buffer_seconds
40+
41+
self.credentials = None
42+
43+
self._lock = threading.Lock()
44+
45+
def retrieve(self):
46+
return self.credentials
47+
48+
def is_expired(self):
49+
return (self.credentials is None or
50+
(self.expired_time and self.expired_time < time.time() + self.expired_buffer_seconds))
51+
52+
def refresh(self):
53+
with self._lock:
54+
if self.is_expired():
55+
self._assume_role_oidc()
56+
57+
def _assume_role_oidc(self):
58+
params = {
59+
'DurationSeconds': self.duration_seconds,
60+
'RoleSessionName': uuid.uuid4().hex,
61+
'RoleTrn': 'trn:iam::' + self.account_id + ':role/' + self.role_name,
62+
'OIDCToken': self.oidc_token,
63+
}
64+
65+
configuration = type.__call__(Configuration)
66+
67+
# configuration.ak = self.ak
68+
# configuration.sk = self.sk
69+
configuration.host = self.host
70+
configuration.region = self.region
71+
configuration.scheme = self.scheme
72+
configuration.read_timeout = self.timeout
73+
c = UniversalApi(ApiClient(configuration))
74+
info = UniversalInfo(method='POST', service='sts', version='2018-01-01', action='AssumeRoleWithOIDC',
75+
content_type='application/x-www-form-urlencoded')
76+
77+
resp, status_code, resp_header = c.do_call_with_http_info(info=info, body=params)
78+
if 'Credentials' not in resp:
79+
raise RuntimeError('failed to retrieve credentials from sts' + str(resp_header))
80+
resp_cred = resp['Credentials']
81+
82+
# Parse the ISO string
83+
dt = dateutil.parser.parse(resp_cred['Expiration'])
84+
85+
# Convert to timestamp (seconds since epoch)
86+
self.expired_time = (dt - datetime(1970, 1, 1, tzinfo=dateutil.tz.tzutc())).total_seconds()
87+
88+
self.credentials = CredentialValue(ak=resp_cred['AccessKeyId'],
89+
sk=resp_cred['SecretAccessKey'],
90+
session_token=resp_cred['SessionToken'],
91+
provider_name='StsOidcCredentialProvider')

volcenginesdkcore/auth/providers/sts_provider.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def _assume_role(self):
6060
'RoleSessionName': uuid.uuid4().hex,
6161
'RoleTrn': 'trn:iam::' + self.account_id + ':role/' + self.role_name,
6262
}
63-
configuration = Configuration()
63+
configuration = type.__call__(Configuration)
6464
configuration.ak = self.ak
6565
configuration.sk = self.sk
6666
configuration.host = self.host

0 commit comments

Comments
 (0)