skyplatform-iam 1.0.3__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- skyplatform_iam/__init__.py +57 -2
- skyplatform_iam/connect_agenterra_iam.py +232 -62
- skyplatform_iam-1.1.0.dist-info/METADATA +461 -0
- skyplatform_iam-1.1.0.dist-info/RECORD +8 -0
- skyplatform_iam-1.0.3.dist-info/METADATA +0 -261
- skyplatform_iam-1.0.3.dist-info/RECORD +0 -8
- {skyplatform_iam-1.0.3.dist-info → skyplatform_iam-1.1.0.dist-info}/WHEEL +0 -0
skyplatform_iam/__init__.py
CHANGED
|
@@ -21,6 +21,9 @@ __version__ = "1.0.0"
|
|
|
21
21
|
__author__ = "x9"
|
|
22
22
|
__description__ = "SkyPlatform IAM认证SDK,提供FastAPI中间件和IAM服务连接功能"
|
|
23
23
|
|
|
24
|
+
# 全局IAM客户端实例
|
|
25
|
+
_global_iam_client = None
|
|
26
|
+
|
|
24
27
|
# 导出主要类和函数
|
|
25
28
|
__all__ = [
|
|
26
29
|
# 配置
|
|
@@ -35,6 +38,7 @@ __all__ = [
|
|
|
35
38
|
|
|
36
39
|
# 客户端
|
|
37
40
|
"ConnectAgenterraIam",
|
|
41
|
+
"get_iam_client",
|
|
38
42
|
|
|
39
43
|
# 异常
|
|
40
44
|
"SkyPlatformAuthException",
|
|
@@ -74,7 +78,7 @@ def create_auth_middleware(config: AuthConfig = None, **kwargs) -> AuthMiddlewar
|
|
|
74
78
|
return AuthMiddleware(config=config, **kwargs)
|
|
75
79
|
|
|
76
80
|
|
|
77
|
-
def
|
|
81
|
+
def init_skyplatform_iam(app, config: AuthConfig = None):
|
|
78
82
|
"""
|
|
79
83
|
一键设置认证中间件的便捷函数
|
|
80
84
|
|
|
@@ -103,4 +107,55 @@ def setup_auth(app, config: AuthConfig = None):
|
|
|
103
107
|
middleware = AuthMiddleware(app=app, config=config)
|
|
104
108
|
app.add_middleware(AuthMiddleware, config=config)
|
|
105
109
|
|
|
106
|
-
return middleware
|
|
110
|
+
return middleware
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def get_iam_client(config: AuthConfig = None) -> ConnectAgenterraIam:
|
|
114
|
+
"""
|
|
115
|
+
获取全局IAM客户端实例
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
config: 认证配置,如果为None则从环境变量创建
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
ConnectAgenterraIam: IAM客户端实例
|
|
122
|
+
|
|
123
|
+
Note:
|
|
124
|
+
此函数使用单例模式,确保整个应用中只有一个IAM客户端实例。
|
|
125
|
+
第一次调用时会创建实例,后续调用会返回同一个实例。
|
|
126
|
+
如果需要更新配置,可以传入新的config参数。
|
|
127
|
+
|
|
128
|
+
Example:
|
|
129
|
+
# 使用默认配置(从环境变量)
|
|
130
|
+
iam_client = get_iam_client()
|
|
131
|
+
|
|
132
|
+
# 使用自定义配置
|
|
133
|
+
config = AuthConfig(
|
|
134
|
+
agenterra_iam_host="https://iam.example.com",
|
|
135
|
+
server_name="my_server",
|
|
136
|
+
access_key="my_access_key"
|
|
137
|
+
)
|
|
138
|
+
iam_client = get_iam_client(config)
|
|
139
|
+
|
|
140
|
+
# 调用IAM服务方法
|
|
141
|
+
result = iam_client.register(
|
|
142
|
+
cred_type="username",
|
|
143
|
+
cred_value="test_user",
|
|
144
|
+
password="password123"
|
|
145
|
+
)
|
|
146
|
+
"""
|
|
147
|
+
global _global_iam_client
|
|
148
|
+
|
|
149
|
+
# 如果传入了新的配置,或者实例不存在,则创建/更新实例
|
|
150
|
+
if config is not None:
|
|
151
|
+
if _global_iam_client is None:
|
|
152
|
+
_global_iam_client = ConnectAgenterraIam(config=config)
|
|
153
|
+
else:
|
|
154
|
+
# 重新加载配置
|
|
155
|
+
_global_iam_client.reload_config(config)
|
|
156
|
+
elif _global_iam_client is None:
|
|
157
|
+
# 使用默认配置创建实例
|
|
158
|
+
default_config = AuthConfig.from_env()
|
|
159
|
+
_global_iam_client = ConnectAgenterraIam(config=default_config)
|
|
160
|
+
|
|
161
|
+
return _global_iam_client
|
|
@@ -189,7 +189,7 @@ class ConnectAgenterraIam(object):
|
|
|
189
189
|
self.logger.info(f"[{method_name}] 响应状态码: {response.status_code}")
|
|
190
190
|
self.logger.info(f"[{method_name}] 响应内容解析失败: {str(e)}")
|
|
191
191
|
|
|
192
|
-
def register(self, cred_type=None, cred_value=None, password=None, nickname=None, avatar_url=None,
|
|
192
|
+
def register(self, cred_type=None, cred_value=None, password=None, nickname=None, avatar_url=None,
|
|
193
193
|
username=None, phone=None):
|
|
194
194
|
"""
|
|
195
195
|
注册用户时,同步至iam
|
|
@@ -212,8 +212,9 @@ class ConnectAgenterraIam(object):
|
|
|
212
212
|
- 失败: 返回False
|
|
213
213
|
"""
|
|
214
214
|
method_name = "register"
|
|
215
|
-
self.logger.info(
|
|
216
|
-
|
|
215
|
+
self.logger.info(
|
|
216
|
+
f"[{method_name}] 开始用户注册 - cred_type: {cred_type}, cred_value: {self._mask_sensitive(str(cred_value))}")
|
|
217
|
+
|
|
217
218
|
try:
|
|
218
219
|
# 参数映射:支持旧的调用方式
|
|
219
220
|
if cred_type is None and cred_value is None:
|
|
@@ -249,10 +250,10 @@ class ConnectAgenterraIam(object):
|
|
|
249
250
|
|
|
250
251
|
uri = "/api/v2/service/register"
|
|
251
252
|
url = self.agenterra_iam_host + uri
|
|
252
|
-
|
|
253
|
+
|
|
253
254
|
# 记录请求信息
|
|
254
255
|
self._log_request(method_name, url, self.headers, body)
|
|
255
|
-
|
|
256
|
+
|
|
256
257
|
response = requests.post(
|
|
257
258
|
url=url,
|
|
258
259
|
headers=self.headers,
|
|
@@ -272,7 +273,7 @@ class ConnectAgenterraIam(object):
|
|
|
272
273
|
self.logger.warning(f"[{method_name}] 用户注册失败 - 响应: {result}")
|
|
273
274
|
else:
|
|
274
275
|
self.logger.warning(f"[{method_name}] 用户注册失败 - 状态码: {response.status_code}")
|
|
275
|
-
|
|
276
|
+
|
|
276
277
|
return False
|
|
277
278
|
except Exception as e:
|
|
278
279
|
self.logger.error(f"[{method_name}] 注册请求异常: {str(e)}")
|
|
@@ -280,7 +281,7 @@ class ConnectAgenterraIam(object):
|
|
|
280
281
|
return False
|
|
281
282
|
|
|
282
283
|
def login_with_password(self, cred_type=None, cred_value=None, password=None, ip_address=None, user_agent=None,
|
|
283
|
-
|
|
284
|
+
username=None):
|
|
284
285
|
"""
|
|
285
286
|
账号密码登陆时,同步至iam,由iam签发token
|
|
286
287
|
|
|
@@ -296,8 +297,9 @@ class ConnectAgenterraIam(object):
|
|
|
296
297
|
- password: 用户密码
|
|
297
298
|
"""
|
|
298
299
|
method_name = "login_with_password"
|
|
299
|
-
self.logger.info(
|
|
300
|
-
|
|
300
|
+
self.logger.info(
|
|
301
|
+
f"[{method_name}] 开始密码登录 - cred_type: {cred_type}, cred_value: {self._mask_sensitive(str(cred_value))}")
|
|
302
|
+
|
|
301
303
|
try:
|
|
302
304
|
# 参数映射:支持旧的调用方式
|
|
303
305
|
if cred_type is None and cred_value is None:
|
|
@@ -328,10 +330,10 @@ class ConnectAgenterraIam(object):
|
|
|
328
330
|
|
|
329
331
|
uri = "/api/v2/service/login"
|
|
330
332
|
url = self.agenterra_iam_host + uri
|
|
331
|
-
|
|
333
|
+
|
|
332
334
|
# 记录请求信息
|
|
333
335
|
self._log_request(method_name, url, self.headers, body)
|
|
334
|
-
|
|
336
|
+
|
|
335
337
|
response = requests.post(
|
|
336
338
|
url=url,
|
|
337
339
|
headers=self.headers,
|
|
@@ -347,7 +349,7 @@ class ConnectAgenterraIam(object):
|
|
|
347
349
|
return response
|
|
348
350
|
else:
|
|
349
351
|
self.logger.warning(f"[{method_name}] 密码登录失败 - 状态码: {response.status_code}")
|
|
350
|
-
|
|
352
|
+
|
|
351
353
|
return False
|
|
352
354
|
except Exception as e:
|
|
353
355
|
self.logger.error(f"[{method_name}] 密码登录请求异常: {str(e)}")
|
|
@@ -355,7 +357,7 @@ class ConnectAgenterraIam(object):
|
|
|
355
357
|
return False
|
|
356
358
|
|
|
357
359
|
def login_without_password(self, cred_type=None, cred_value=None, ip_address=None, user_agent=None,
|
|
358
|
-
|
|
360
|
+
username=None):
|
|
359
361
|
"""
|
|
360
362
|
短信验证码登陆时,机机接口请求token
|
|
361
363
|
|
|
@@ -371,8 +373,9 @@ class ConnectAgenterraIam(object):
|
|
|
371
373
|
返回: response对象或False
|
|
372
374
|
"""
|
|
373
375
|
method_name = "login_without_password"
|
|
374
|
-
self.logger.info(
|
|
375
|
-
|
|
376
|
+
self.logger.info(
|
|
377
|
+
f"[{method_name}] 开始免密登录 - cred_type: {cred_type}, cred_value: {self._mask_sensitive(str(cred_value))}")
|
|
378
|
+
|
|
376
379
|
try:
|
|
377
380
|
# 参数映射:支持旧的调用方式
|
|
378
381
|
if cred_type is None and cred_value is None:
|
|
@@ -402,10 +405,10 @@ class ConnectAgenterraIam(object):
|
|
|
402
405
|
|
|
403
406
|
uri = "/api/v2/service/login_without_password"
|
|
404
407
|
url = self.agenterra_iam_host + uri
|
|
405
|
-
|
|
408
|
+
|
|
406
409
|
# 记录请求信息
|
|
407
410
|
self._log_request(method_name, url, self.headers, body)
|
|
408
|
-
|
|
411
|
+
|
|
409
412
|
response = requests.post(
|
|
410
413
|
url=url,
|
|
411
414
|
headers=self.headers,
|
|
@@ -421,7 +424,7 @@ class ConnectAgenterraIam(object):
|
|
|
421
424
|
return response
|
|
422
425
|
else:
|
|
423
426
|
self.logger.warning(f"[{method_name}] 免密登录失败 - 状态码: {response.status_code}")
|
|
424
|
-
|
|
427
|
+
|
|
425
428
|
return False
|
|
426
429
|
except Exception as e:
|
|
427
430
|
self.logger.error(f"[{method_name}] 免密登录请求异常: {str(e)}")
|
|
@@ -436,7 +439,7 @@ class ConnectAgenterraIam(object):
|
|
|
436
439
|
"""
|
|
437
440
|
method_name = "logout"
|
|
438
441
|
self.logger.info(f"[{method_name}] 开始用户登出 - token: {self._mask_sensitive(token)}")
|
|
439
|
-
|
|
442
|
+
|
|
440
443
|
try:
|
|
441
444
|
body = {
|
|
442
445
|
"server_name": self.server_name,
|
|
@@ -445,7 +448,7 @@ class ConnectAgenterraIam(object):
|
|
|
445
448
|
}
|
|
446
449
|
uri = "/api/v2/service/logout"
|
|
447
450
|
url = self.agenterra_iam_host + uri
|
|
448
|
-
|
|
451
|
+
|
|
449
452
|
# 记录请求信息
|
|
450
453
|
self._log_request(method_name, url, self.headers, body)
|
|
451
454
|
|
|
@@ -464,7 +467,7 @@ class ConnectAgenterraIam(object):
|
|
|
464
467
|
return True
|
|
465
468
|
else:
|
|
466
469
|
self.logger.warning(f"[{method_name}] 用户登出失败 - 状态码: {response.status_code}")
|
|
467
|
-
|
|
470
|
+
|
|
468
471
|
return False
|
|
469
472
|
except Exception as e:
|
|
470
473
|
self.logger.error(f"[{method_name}] 登出请求异常: {str(e)}")
|
|
@@ -484,8 +487,9 @@ class ConnectAgenterraIam(object):
|
|
|
484
487
|
- token无效或其他错误: 返回None
|
|
485
488
|
"""
|
|
486
489
|
method_name = "verify_token"
|
|
487
|
-
self.logger.info(
|
|
488
|
-
|
|
490
|
+
self.logger.info(
|
|
491
|
+
f"[{method_name}] 开始token验证 - api: {api}, method: {method}, token: {self._mask_sensitive(token)}")
|
|
492
|
+
|
|
489
493
|
try:
|
|
490
494
|
body = {
|
|
491
495
|
"server_name": self.server_name,
|
|
@@ -497,16 +501,16 @@ class ConnectAgenterraIam(object):
|
|
|
497
501
|
"server_sk": server_sk,
|
|
498
502
|
}
|
|
499
503
|
uri = "/api/v2/service/verify"
|
|
500
|
-
|
|
504
|
+
|
|
501
505
|
# 检查agenterra_iam_host是否为None
|
|
502
506
|
if self.agenterra_iam_host is None:
|
|
503
507
|
raise ValueError("AGENTERRA_IAM_HOST 配置未设置或为空,请确保传入正确的AuthConfig对象")
|
|
504
|
-
|
|
508
|
+
|
|
505
509
|
url = self.agenterra_iam_host + uri
|
|
506
|
-
|
|
510
|
+
|
|
507
511
|
# 记录请求信息
|
|
508
512
|
self._log_request(method_name, url, self.headers, body)
|
|
509
|
-
|
|
513
|
+
|
|
510
514
|
response = requests.post(
|
|
511
515
|
url=url,
|
|
512
516
|
headers=self.headers,
|
|
@@ -530,7 +534,8 @@ class ConnectAgenterraIam(object):
|
|
|
530
534
|
"microservice": result.get("microservice"),
|
|
531
535
|
"is_whitelist": result.get("is_whitelist", False)
|
|
532
536
|
}
|
|
533
|
-
self.logger.info(
|
|
537
|
+
self.logger.info(
|
|
538
|
+
f"[{method_name}] token验证成功,用户有权限 - user_id: {user_info.get('user_id')}")
|
|
534
539
|
return user_info
|
|
535
540
|
else:
|
|
536
541
|
# token有效但无权限,抛出403异常
|
|
@@ -540,7 +545,8 @@ class ConnectAgenterraIam(object):
|
|
|
540
545
|
detail=result.get("message", "用户无权限访问此API")
|
|
541
546
|
)
|
|
542
547
|
else:
|
|
543
|
-
self.logger.warning(
|
|
548
|
+
self.logger.warning(
|
|
549
|
+
f"[{method_name}] token验证失败 - success: {result.get('success')}, valid: {result.get('valid')}")
|
|
544
550
|
|
|
545
551
|
elif response.status_code == 403:
|
|
546
552
|
result = response.json()
|
|
@@ -576,11 +582,11 @@ class ConnectAgenterraIam(object):
|
|
|
576
582
|
"""
|
|
577
583
|
method_name = "reset_password"
|
|
578
584
|
self.logger.info(f"[{method_name}] 开始重置密码 - user_id: {user_id}")
|
|
579
|
-
|
|
585
|
+
|
|
580
586
|
# 记录旧参数格式的使用
|
|
581
587
|
if username or password:
|
|
582
588
|
self.logger.debug(f"[{method_name}] 检测到旧参数格式 - username: {username}")
|
|
583
|
-
|
|
589
|
+
|
|
584
590
|
try:
|
|
585
591
|
# 参数映射:支持旧的调用方式
|
|
586
592
|
if user_id is None and new_password is None:
|
|
@@ -599,26 +605,26 @@ class ConnectAgenterraIam(object):
|
|
|
599
605
|
}
|
|
600
606
|
uri = "/api/v2/service/reset_password"
|
|
601
607
|
url = self.agenterra_iam_host + uri
|
|
602
|
-
|
|
608
|
+
|
|
603
609
|
# 记录请求信息
|
|
604
610
|
self._log_request(method_name, url, self.headers, body)
|
|
605
|
-
|
|
611
|
+
|
|
606
612
|
response = requests.post(
|
|
607
613
|
url=url,
|
|
608
614
|
headers=self.headers,
|
|
609
615
|
json=body,
|
|
610
616
|
verify=False
|
|
611
617
|
)
|
|
612
|
-
|
|
618
|
+
|
|
613
619
|
# 记录响应信息
|
|
614
620
|
self._log_response(method_name, response)
|
|
615
|
-
|
|
621
|
+
|
|
616
622
|
if response.status_code == 200:
|
|
617
623
|
self.logger.info(f"[{method_name}] 密码重置成功")
|
|
618
624
|
return True
|
|
619
625
|
else:
|
|
620
626
|
self.logger.warning(f"[{method_name}] 密码重置失败 - 状态码: {response.status_code}")
|
|
621
|
-
|
|
627
|
+
|
|
622
628
|
return False
|
|
623
629
|
except Exception as e:
|
|
624
630
|
self.logger.error(f"[{method_name}] 重置密码请求异常: {str(e)}")
|
|
@@ -636,7 +642,7 @@ class ConnectAgenterraIam(object):
|
|
|
636
642
|
"""
|
|
637
643
|
method_name = "refresh_token"
|
|
638
644
|
self.logger.info(f"[{method_name}] 开始刷新令牌 - refresh_token: {self._mask_sensitive(refresh_token)}")
|
|
639
|
-
|
|
645
|
+
|
|
640
646
|
try:
|
|
641
647
|
body = {
|
|
642
648
|
"server_name": self.server_name,
|
|
@@ -645,10 +651,10 @@ class ConnectAgenterraIam(object):
|
|
|
645
651
|
}
|
|
646
652
|
uri = "/api/v2/service/refresh_token"
|
|
647
653
|
url = self.agenterra_iam_host + uri
|
|
648
|
-
|
|
654
|
+
|
|
649
655
|
# 记录请求信息
|
|
650
656
|
self._log_request(method_name, url, self.headers, body)
|
|
651
|
-
|
|
657
|
+
|
|
652
658
|
response = requests.post(
|
|
653
659
|
url=url,
|
|
654
660
|
headers=self.headers,
|
|
@@ -664,7 +670,7 @@ class ConnectAgenterraIam(object):
|
|
|
664
670
|
return response
|
|
665
671
|
else:
|
|
666
672
|
self.logger.warning(f"[{method_name}] 令牌刷新失败 - 状态码: {response.status_code}")
|
|
667
|
-
|
|
673
|
+
|
|
668
674
|
return False
|
|
669
675
|
except Exception as e:
|
|
670
676
|
self.logger.error(f"[{method_name}] 刷新令牌请求异常: {str(e)}")
|
|
@@ -683,7 +689,7 @@ class ConnectAgenterraIam(object):
|
|
|
683
689
|
"""
|
|
684
690
|
method_name = "assign_role_to_user"
|
|
685
691
|
self.logger.info(f"[{method_name}] 开始角色分配 - user_id: {user_id}, role_id: {role_id}")
|
|
686
|
-
|
|
692
|
+
|
|
687
693
|
try:
|
|
688
694
|
body = {
|
|
689
695
|
"server_name": self.server_name,
|
|
@@ -693,10 +699,10 @@ class ConnectAgenterraIam(object):
|
|
|
693
699
|
}
|
|
694
700
|
uri = "/api/v2/service/assign_role"
|
|
695
701
|
url = self.agenterra_iam_host + uri
|
|
696
|
-
|
|
702
|
+
|
|
697
703
|
# 记录请求信息
|
|
698
704
|
self._log_request(method_name, url, self.headers, body)
|
|
699
|
-
|
|
705
|
+
|
|
700
706
|
response = requests.post(
|
|
701
707
|
url=url,
|
|
702
708
|
headers=self.headers,
|
|
@@ -712,7 +718,7 @@ class ConnectAgenterraIam(object):
|
|
|
712
718
|
return True
|
|
713
719
|
else:
|
|
714
720
|
self.logger.warning(f"[{method_name}] 角色分配失败 - 状态码: {response.status_code}")
|
|
715
|
-
|
|
721
|
+
|
|
716
722
|
return False
|
|
717
723
|
except Exception as e:
|
|
718
724
|
self.logger.error(f"[{method_name}] 角色分配请求异常: {str(e)}")
|
|
@@ -725,7 +731,7 @@ class ConnectAgenterraIam(object):
|
|
|
725
731
|
"""
|
|
726
732
|
method_name = "get_userinfo_by_token"
|
|
727
733
|
self.logger.info(f"[{method_name}] 开始获取用户信息 - token: {self._mask_sensitive(token)}")
|
|
728
|
-
|
|
734
|
+
|
|
729
735
|
try:
|
|
730
736
|
body = {
|
|
731
737
|
"server_name": self.server_name,
|
|
@@ -734,10 +740,10 @@ class ConnectAgenterraIam(object):
|
|
|
734
740
|
}
|
|
735
741
|
uri = "/api/v2/service/token"
|
|
736
742
|
url = self.agenterra_iam_host + uri
|
|
737
|
-
|
|
743
|
+
|
|
738
744
|
# 记录请求信息
|
|
739
745
|
self._log_request(method_name, url, self.headers, body)
|
|
740
|
-
|
|
746
|
+
|
|
741
747
|
response = requests.post(
|
|
742
748
|
url=url,
|
|
743
749
|
headers=self.headers,
|
|
@@ -753,17 +759,179 @@ class ConnectAgenterraIam(object):
|
|
|
753
759
|
return response
|
|
754
760
|
else:
|
|
755
761
|
self.logger.warning(f"[{method_name}] 获取用户信息失败 - 状态码: {response.status_code}")
|
|
756
|
-
|
|
762
|
+
|
|
757
763
|
return False
|
|
758
764
|
except Exception as e:
|
|
759
765
|
self.logger.error(f"[{method_name}] 获取用户信息请求异常: {str(e)}")
|
|
760
766
|
self.logger.error(f"[{method_name}] 异常堆栈: {traceback.format_exc()}")
|
|
761
767
|
return False
|
|
762
768
|
|
|
769
|
+
def add_custom_config(self, user_id, config_name, config_value=None):
|
|
770
|
+
"""
|
|
771
|
+
机机接口:添加用户自定义配置
|
|
772
|
+
|
|
773
|
+
为指定用户添加或更新自定义属性配置。
|
|
774
|
+
|
|
775
|
+
参数:
|
|
776
|
+
- user_id: 用户ID
|
|
777
|
+
- config_name: 配置项名称
|
|
778
|
+
- config_value: 配置项值(可选)
|
|
779
|
+
|
|
780
|
+
返回:
|
|
781
|
+
- 成功: 返回响应对象
|
|
782
|
+
- 失败: 返回False
|
|
783
|
+
"""
|
|
784
|
+
method_name = "add_custom_config"
|
|
785
|
+
self.logger.info(f"[{method_name}] 开始添加用户自定义配置 - user_id: {user_id}, config_name: {config_name}")
|
|
786
|
+
|
|
787
|
+
try:
|
|
788
|
+
body = {
|
|
789
|
+
"server_name": self.server_name,
|
|
790
|
+
"access_key": self.access_key,
|
|
791
|
+
"user_id": user_id,
|
|
792
|
+
"config_name": config_name
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
# 添加可选参数
|
|
796
|
+
if config_value is not None:
|
|
797
|
+
body["config_value"] = config_value
|
|
798
|
+
|
|
799
|
+
uri = "/api/v2/service/add_custom_config"
|
|
800
|
+
url = self.agenterra_iam_host + uri
|
|
801
|
+
|
|
802
|
+
# 记录请求信息
|
|
803
|
+
self._log_request(method_name, url, self.headers, body)
|
|
804
|
+
|
|
805
|
+
response = requests.post(
|
|
806
|
+
url=url,
|
|
807
|
+
headers=self.headers,
|
|
808
|
+
json=body,
|
|
809
|
+
verify=False
|
|
810
|
+
)
|
|
811
|
+
|
|
812
|
+
# 记录响应信息
|
|
813
|
+
self._log_response(method_name, response)
|
|
814
|
+
|
|
815
|
+
if response.status_code == 200:
|
|
816
|
+
self.logger.info(f"[{method_name}] 添加用户自定义配置成功")
|
|
817
|
+
return response
|
|
818
|
+
else:
|
|
819
|
+
self.logger.warning(f"[{method_name}] 添加用户自定义配置失败 - 状态码: {response.status_code}")
|
|
820
|
+
|
|
821
|
+
return False
|
|
822
|
+
except Exception as e:
|
|
823
|
+
self.logger.error(f"[{method_name}] 添加用户自定义配置请求异常: {str(e)}")
|
|
824
|
+
self.logger.error(f"[{method_name}] 异常堆栈: {traceback.format_exc()}")
|
|
825
|
+
return False
|
|
826
|
+
|
|
827
|
+
def get_custom_configs(self, user_id):
|
|
828
|
+
"""
|
|
829
|
+
机机接口:获取用户自定义配置
|
|
830
|
+
|
|
831
|
+
获取指定用户的所有自定义属性配置。
|
|
832
|
+
|
|
833
|
+
参数:
|
|
834
|
+
- user_id: 用户ID
|
|
835
|
+
|
|
836
|
+
返回:
|
|
837
|
+
- 成功: 返回响应对象
|
|
838
|
+
- 失败: 返回False
|
|
839
|
+
"""
|
|
840
|
+
method_name = "get_custom_configs"
|
|
841
|
+
self.logger.info(f"[{method_name}] 开始获取用户自定义配置 - user_id: {user_id}")
|
|
842
|
+
|
|
843
|
+
try:
|
|
844
|
+
body = {
|
|
845
|
+
"server_name": self.server_name,
|
|
846
|
+
"access_key": self.access_key,
|
|
847
|
+
"user_id": user_id
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
uri = "/api/v2/service/get_custom_configs"
|
|
851
|
+
url = self.agenterra_iam_host + uri
|
|
852
|
+
|
|
853
|
+
# 记录请求信息
|
|
854
|
+
self._log_request(method_name, url, self.headers, body)
|
|
855
|
+
|
|
856
|
+
response = requests.post(
|
|
857
|
+
url=url,
|
|
858
|
+
headers=self.headers,
|
|
859
|
+
json=body,
|
|
860
|
+
verify=False
|
|
861
|
+
)
|
|
862
|
+
|
|
863
|
+
# 记录响应信息
|
|
864
|
+
self._log_response(method_name, response)
|
|
865
|
+
|
|
866
|
+
if response.status_code == 200:
|
|
867
|
+
self.logger.info(f"[{method_name}] 获取用户自定义配置成功")
|
|
868
|
+
return response
|
|
869
|
+
else:
|
|
870
|
+
self.logger.warning(f"[{method_name}] 获取用户自定义配置失败 - 状态码: {response.status_code}")
|
|
871
|
+
|
|
872
|
+
return False
|
|
873
|
+
except Exception as e:
|
|
874
|
+
self.logger.error(f"[{method_name}] 获取用户自定义配置请求异常: {str(e)}")
|
|
875
|
+
self.logger.error(f"[{method_name}] 异常堆栈: {traceback.format_exc()}")
|
|
876
|
+
return False
|
|
877
|
+
|
|
878
|
+
def delete_custom_config(self, user_id, config_name):
|
|
879
|
+
"""
|
|
880
|
+
机机接口:删除用户自定义配置
|
|
881
|
+
|
|
882
|
+
删除指定用户的指定自定义属性配置。
|
|
883
|
+
|
|
884
|
+
参数:
|
|
885
|
+
- user_id: 用户ID
|
|
886
|
+
- config_name: 配置项名称
|
|
887
|
+
|
|
888
|
+
返回:
|
|
889
|
+
- 成功: 返回响应对象
|
|
890
|
+
- 失败: 返回False
|
|
891
|
+
"""
|
|
892
|
+
method_name = "delete_custom_config"
|
|
893
|
+
self.logger.info(f"[{method_name}] 开始删除用户自定义配置 - user_id: {user_id}, config_name: {config_name}")
|
|
894
|
+
|
|
895
|
+
try:
|
|
896
|
+
body = {
|
|
897
|
+
"server_name": self.server_name,
|
|
898
|
+
"access_key": self.access_key,
|
|
899
|
+
"user_id": user_id,
|
|
900
|
+
"config_name": config_name
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
uri = "/api/v2/service/delete_custom_config"
|
|
904
|
+
url = self.agenterra_iam_host + uri
|
|
905
|
+
|
|
906
|
+
# 记录请求信息
|
|
907
|
+
self._log_request(method_name, url, self.headers, body)
|
|
908
|
+
|
|
909
|
+
response = requests.post(
|
|
910
|
+
url=url,
|
|
911
|
+
headers=self.headers,
|
|
912
|
+
json=body,
|
|
913
|
+
verify=False
|
|
914
|
+
)
|
|
915
|
+
|
|
916
|
+
# 记录响应信息
|
|
917
|
+
self._log_response(method_name, response)
|
|
918
|
+
|
|
919
|
+
if response.status_code == 200:
|
|
920
|
+
self.logger.info(f"[{method_name}] 删除用户自定义配置成功")
|
|
921
|
+
return response
|
|
922
|
+
else:
|
|
923
|
+
self.logger.warning(f"[{method_name}] 删除用户自定义配置失败 - 状态码: {response.status_code}")
|
|
924
|
+
|
|
925
|
+
return False
|
|
926
|
+
except Exception as e:
|
|
927
|
+
self.logger.error(f"[{method_name}] 删除用户自定义配置请求异常: {str(e)}")
|
|
928
|
+
self.logger.error(f"[{method_name}] 异常堆栈: {traceback.format_exc()}")
|
|
929
|
+
return False
|
|
930
|
+
|
|
763
931
|
def merge_credential(self, target_user_id, cred_type, cred_value, merge_reason=None):
|
|
764
932
|
"""
|
|
765
933
|
机机接口:凭证合并
|
|
766
|
-
|
|
934
|
+
|
|
767
935
|
为第三方服务提供凭证合并功能,处理用户绑定新凭证时的账号合并场景。
|
|
768
936
|
例如用户先用账号密码注册,后续又绑定手机号时的账号合并需求。
|
|
769
937
|
|
|
@@ -773,13 +941,14 @@ class ConnectAgenterraIam(object):
|
|
|
773
941
|
- cred_value: 要绑定的凭证值
|
|
774
942
|
- merge_reason: 合并原因(可选)
|
|
775
943
|
|
|
776
|
-
返回:
|
|
944
|
+
返回:
|
|
777
945
|
- 成功: 返回响应对象
|
|
778
946
|
- 失败: 返回False
|
|
779
947
|
"""
|
|
780
948
|
method_name = "merge_credential"
|
|
781
|
-
self.logger.info(
|
|
782
|
-
|
|
949
|
+
self.logger.info(
|
|
950
|
+
f"[{method_name}] 开始凭证合并 - target_user_id: {target_user_id}, cred_type: {cred_type}, cred_value: {self._mask_sensitive(cred_value)}")
|
|
951
|
+
|
|
783
952
|
try:
|
|
784
953
|
# 验证凭证类型
|
|
785
954
|
if isinstance(cred_type, str):
|
|
@@ -800,10 +969,10 @@ class ConnectAgenterraIam(object):
|
|
|
800
969
|
|
|
801
970
|
uri = "/api/v2/service/merge_credential"
|
|
802
971
|
url = self.agenterra_iam_host + uri
|
|
803
|
-
|
|
972
|
+
|
|
804
973
|
# 记录请求信息
|
|
805
974
|
self._log_request(method_name, url, self.headers, body)
|
|
806
|
-
|
|
975
|
+
|
|
807
976
|
response = requests.post(
|
|
808
977
|
url=url,
|
|
809
978
|
headers=self.headers,
|
|
@@ -819,7 +988,7 @@ class ConnectAgenterraIam(object):
|
|
|
819
988
|
return response
|
|
820
989
|
else:
|
|
821
990
|
self.logger.warning(f"[{method_name}] 凭证合并失败 - 状态码: {response.status_code}")
|
|
822
|
-
|
|
991
|
+
|
|
823
992
|
return False
|
|
824
993
|
except Exception as e:
|
|
825
994
|
self.logger.error(f"[{method_name}] 凭证合并请求异常: {str(e)}")
|
|
@@ -829,20 +998,21 @@ class ConnectAgenterraIam(object):
|
|
|
829
998
|
def get_user_by_credential(self, cred_type, cred_value):
|
|
830
999
|
"""
|
|
831
1000
|
机机接口:通过凭证获取用户信息
|
|
832
|
-
|
|
1001
|
+
|
|
833
1002
|
为第三方服务提供通过用户名或手机号等认证凭据获取用户信息的功能。
|
|
834
1003
|
|
|
835
1004
|
参数:
|
|
836
1005
|
- cred_type: 凭证类型 (CredentialTypeEnum: username, email, phone, wechat_openid)
|
|
837
1006
|
- cred_value: 凭证值
|
|
838
1007
|
|
|
839
|
-
返回:
|
|
1008
|
+
返回:
|
|
840
1009
|
- 成功: 返回响应对象
|
|
841
1010
|
- 失败: 返回False
|
|
842
1011
|
"""
|
|
843
1012
|
method_name = "get_user_by_credential"
|
|
844
|
-
self.logger.info(
|
|
845
|
-
|
|
1013
|
+
self.logger.info(
|
|
1014
|
+
f"[{method_name}] 开始获取用户信息 - cred_type: {cred_type}, cred_value: {self._mask_sensitive(cred_value)}")
|
|
1015
|
+
|
|
846
1016
|
try:
|
|
847
1017
|
# 验证凭证类型
|
|
848
1018
|
if isinstance(cred_type, str):
|
|
@@ -857,10 +1027,10 @@ class ConnectAgenterraIam(object):
|
|
|
857
1027
|
|
|
858
1028
|
uri = "/api/v2/service/get_user_by_credential"
|
|
859
1029
|
url = self.agenterra_iam_host + uri
|
|
860
|
-
|
|
1030
|
+
|
|
861
1031
|
# 记录请求信息
|
|
862
1032
|
self._log_request(method_name, url, self.headers, body)
|
|
863
|
-
|
|
1033
|
+
|
|
864
1034
|
response = requests.post(
|
|
865
1035
|
url=url,
|
|
866
1036
|
headers=self.headers,
|
|
@@ -876,7 +1046,7 @@ class ConnectAgenterraIam(object):
|
|
|
876
1046
|
return response
|
|
877
1047
|
else:
|
|
878
1048
|
self.logger.warning(f"[{method_name}] 获取用户信息失败 - 状态码: {response.status_code}")
|
|
879
|
-
|
|
1049
|
+
|
|
880
1050
|
return False
|
|
881
1051
|
except Exception as e:
|
|
882
1052
|
self.logger.error(f"[{method_name}] 获取用户信息请求异常: {str(e)}")
|