keys.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. """
  2. 密钥管理接口
  3. """
  4. from fastapi import APIRouter, Depends
  5. from sqlalchemy.orm import Session
  6. from app.database import get_db
  7. from app.models.api_key import APIKey
  8. from datetime import datetime, timedelta
  9. from app.utils.timezone import beijing_now
  10. router = APIRouter()
  11. @router.get("/public")
  12. async def get_public_key(db: Session = Depends(get_db)):
  13. """
  14. 获取公钥 (向后兼容接口)
  15. @deprecated: 建议使用 /api/keys/version 接口
  16. """
  17. # 获取当前激活的密钥
  18. key = db.query(APIKey).filter(APIKey.is_active == 1).first()
  19. if not key:
  20. return {"code": 404, "msg": "未找到激活的密钥"}
  21. return {
  22. "code": 200,
  23. "msg": "成功",
  24. "data": {
  25. "public_key": key.public_key,
  26. "key_version": key.key_version
  27. }
  28. }
  29. @router.get("/version")
  30. async def get_key_version(db: Session = Depends(get_db)):
  31. """
  32. 获取当前密钥版本信息
  33. 返回当前激活的密钥版本,用于客户端配置验证
  34. """
  35. # 获取当前激活的密钥
  36. key = db.query(APIKey).filter(APIKey.is_active == 1).first()
  37. if not key:
  38. return {"code": 404, "msg": "未找到激活的密钥"}
  39. # 获取所有可用的密钥版本列表(包括当前激活的和新预热的)
  40. available_keys = db.query(APIKey).filter(
  41. APIKey.is_deleted == 0,
  42. APIKey.expire_at.is_(None) | (APIKey.expire_at > beijing_now())
  43. ).order_by(APIKey.key_version.desc()).all()
  44. available_versions = [k.key_version for k in available_keys]
  45. return {
  46. "code": 200,
  47. "msg": "成功",
  48. "data": {
  49. "current_version": key.key_version,
  50. "available_versions": available_versions,
  51. "public_key": key.public_key, # 仍然提供公钥,用于客户端更新配置
  52. "expire_at": key.expire_at.isoformat() if key.expire_at else None
  53. }
  54. }