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.
@@ -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 setup_auth(app, config: AuthConfig = None):
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(f"[{method_name}] 开始用户注册 - cred_type: {cred_type}, cred_value: {self._mask_sensitive(str(cred_value))}")
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
- username=None):
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(f"[{method_name}] 开始密码登录 - cred_type: {cred_type}, cred_value: {self._mask_sensitive(str(cred_value))}")
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
- username=None):
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(f"[{method_name}] 开始免密登录 - cred_type: {cred_type}, cred_value: {self._mask_sensitive(str(cred_value))}")
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(f"[{method_name}] 开始token验证 - api: {api}, method: {method}, token: {self._mask_sensitive(token)}")
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(f"[{method_name}] token验证成功,用户有权限 - user_id: {user_info.get('user_id')}")
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(f"[{method_name}] token验证失败 - success: {result.get('success')}, valid: {result.get('valid')}")
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(f"[{method_name}] 开始凭证合并 - target_user_id: {target_user_id}, cred_type: {cred_type}, cred_value: {self._mask_sensitive(cred_value)}")
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(f"[{method_name}] 开始获取用户信息 - cred_type: {cred_type}, cred_value: {self._mask_sensitive(cred_value)}")
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)}")