rz_token.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import json
  2. import time
  3. from pathlib import Path
  4. import requests
  5. from log import logger
  6. CONFIG = {
  7. "base_url": "http://10.172.12.201:31000",
  8. # Token接口
  9. "token_path": "/api/identityserverService/connect/token",
  10. "username": "dskj1",
  11. "client_id": "044fc37a-859d-4063-b897-2e1c93a52074",
  12. "client_secret": "56CE732DBE97195E2376F79B1D494008",
  13. "grant_type": "delegation",
  14. "token_file": "token_cache.json",
  15. # 资产台账接口
  16. "asset_api": "/api/openapiService/asset/v2/assetAccount",
  17. }
  18. # ===================== 【2】Token 管理器(复用之前的,自动缓存+刷新) =====================
  19. class TokenManager:
  20. def __init__(self, config):
  21. self.config = config
  22. self.token_file = Path(config["token_file"])
  23. self.session = requests.Session()
  24. def _save_token(self, token_data):
  25. expire_time = int(time.time()) + token_data["expires_in"] - 60
  26. token_data["expire_time"] = expire_time
  27. with open(self.token_file, "w", encoding="utf-8") as f:
  28. json.dump(token_data, f, ensure_ascii=False, indent=2)
  29. def _load_token_from_file(self):
  30. if not self.token_file.exists():
  31. return None
  32. try:
  33. with open(self.token_file, "r", encoding="utf-8") as f:
  34. return json.load(f)
  35. except:
  36. return None
  37. def _is_token_valid(self, token_data):
  38. if not token_data:
  39. return False
  40. required_fields = ["access_token", "expire_time", "token_type"]
  41. for field in required_fields:
  42. if field not in token_data:
  43. return False
  44. current_time = int(time.time())
  45. if token_data["expire_time"] <= current_time:
  46. return False
  47. return True
  48. def _get_new_token(self):
  49. url = self.config["base_url"] + self.config["token_path"]
  50. data = {
  51. "username": self.config["username"],
  52. "client_id": self.config["client_id"],
  53. "client_secret": self.config["client_secret"],
  54. "grant_type": self.config["grant_type"]
  55. }
  56. headers = {"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"}
  57. try:
  58. response = self.session.post(url, data=data, headers=headers, timeout=15)
  59. response.raise_for_status()
  60. result = response.json()
  61. if "access_token" not in result:
  62. raise Exception(f"获取Token失败:{result}")
  63. return result
  64. except Exception as e:
  65. raise Exception(f"请求Token异常:{str(e)}")
  66. def get_auth_header(self):
  67. token_data = self._load_token_from_file()
  68. if self._is_token_valid(token_data):
  69. logger.debug("使用缓存Token")
  70. else:
  71. logger.debug("Token无效/已过期,重新获取...")
  72. token_data = self._get_new_token()
  73. self._save_token(token_data)
  74. logger.debug("新Token已保存")
  75. return f"{token_data['token_type']} {token_data['access_token']}"
  76. # ===================== 使用示例 =====================
  77. if __name__ == "__main__":
  78. # 初始化管理器
  79. token_manager = TokenManager(CONFIG)
  80. # 获取认证头
  81. auth_header = token_manager.get_auth_header()
  82. logger.info(f"最终认证头: {auth_header}")
  83. # 调用其他接口时直接使用:
  84. # headers = {"Authorization": auth_header}
  85. # requests.get(url, headers=headers)