| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- import json
- import time
- from pathlib import Path
- import requests
- from log import logger
- CONFIG = {
- "base_url": "http://10.172.12.201:31000",
- # Token接口
- "token_path": "/api/identityserverService/connect/token",
- "username": "dskj1",
- "client_id": "044fc37a-859d-4063-b897-2e1c93a52074",
- "client_secret": "56CE732DBE97195E2376F79B1D494008",
- "grant_type": "delegation",
- "token_file": "token_cache.json",
- # 资产台账接口
- "asset_api": "/api/openapiService/asset/v2/assetAccount",
- }
- # ===================== 【2】Token 管理器(复用之前的,自动缓存+刷新) =====================
- class TokenManager:
- def __init__(self, config):
- self.config = config
- self.token_file = Path(config["token_file"])
- self.session = requests.Session()
- def _save_token(self, token_data):
- expire_time = int(time.time()) + token_data["expires_in"] - 60
- token_data["expire_time"] = expire_time
- with open(self.token_file, "w", encoding="utf-8") as f:
- json.dump(token_data, f, ensure_ascii=False, indent=2)
- def _load_token_from_file(self):
- if not self.token_file.exists():
- return None
- try:
- with open(self.token_file, "r", encoding="utf-8") as f:
- return json.load(f)
- except:
- return None
- def _is_token_valid(self, token_data):
- if not token_data:
- return False
- required_fields = ["access_token", "expire_time", "token_type"]
- for field in required_fields:
- if field not in token_data:
- return False
- current_time = int(time.time())
- if token_data["expire_time"] <= current_time:
- return False
- return True
- def _get_new_token(self):
- url = self.config["base_url"] + self.config["token_path"]
- data = {
- "username": self.config["username"],
- "client_id": self.config["client_id"],
- "client_secret": self.config["client_secret"],
- "grant_type": self.config["grant_type"]
- }
- headers = {"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"}
- try:
- response = self.session.post(url, data=data, headers=headers, timeout=15)
- response.raise_for_status()
- result = response.json()
- if "access_token" not in result:
- raise Exception(f"获取Token失败:{result}")
- return result
- except Exception as e:
- raise Exception(f"请求Token异常:{str(e)}")
- def get_auth_header(self):
- token_data = self._load_token_from_file()
- if self._is_token_valid(token_data):
- logger.debug("使用缓存Token")
- else:
- logger.debug("Token无效/已过期,重新获取...")
- token_data = self._get_new_token()
- self._save_token(token_data)
- logger.debug("新Token已保存")
- return f"{token_data['token_type']} {token_data['access_token']}"
- # ===================== 使用示例 =====================
- if __name__ == "__main__":
- # 初始化管理器
- token_manager = TokenManager(CONFIG)
- # 获取认证头
- auth_header = token_manager.get_auth_header()
- logger.info(f"最终认证头: {auth_header}")
- # 调用其他接口时直接使用:
- # headers = {"Authorization": auth_header}
- # requests.get(url, headers=headers)
|