test_sliding_token.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 测试滑动过期Token机制
  5. """
  6. import sys
  7. import os
  8. import asyncio
  9. from datetime import datetime, timedelta, timezone
  10. # 添加src目录到Python路径
  11. sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))
  12. from app.services.jwt_token import (
  13. create_access_token,
  14. verify_token,
  15. verify_and_refresh_token,
  16. refresh_token_sliding_expiration
  17. )
  18. from app.core.config import config_handler
  19. def test_token_creation():
  20. """测试token创建"""
  21. print("🧪 测试1: Token创建")
  22. # 创建测试数据
  23. test_data = {
  24. "sub": "test_user_123",
  25. "username": "testuser",
  26. "email": "test@example.com",
  27. "is_superuser": False
  28. }
  29. # 创建token
  30. token = create_access_token(test_data)
  31. print(f"✅ Token创建成功: {token[:50]}...")
  32. # 验证token
  33. payload = verify_token(token)
  34. if payload:
  35. print(f"✅ Token验证成功: 用户={payload.get('username')}")
  36. print(f" 过期时间: {datetime.fromtimestamp(payload.get('exp'), tz=timezone.utc)}")
  37. else:
  38. print("❌ Token验证失败")
  39. return token
  40. def test_sliding_expiration(token):
  41. """测试滑动过期机制"""
  42. print("\n🧪 测试2: 滑动过期机制")
  43. # 第一次验证(应该不需要刷新)
  44. payload, new_token = verify_and_refresh_token(token)
  45. if payload:
  46. print(f"✅ 第一次验证成功: 用户={payload.get('username')}")
  47. if new_token:
  48. print(f"🔄 Token被刷新: {new_token[:50]}...")
  49. return new_token
  50. else:
  51. print("ℹ️ Token无需刷新")
  52. return token
  53. else:
  54. print("❌ Token验证失败")
  55. return None
  56. def test_token_refresh(token):
  57. """测试token刷新"""
  58. print("\n🧪 测试3: 手动Token刷新")
  59. new_token = refresh_token_sliding_expiration(token)
  60. if new_token:
  61. print(f"✅ Token刷新成功: {new_token[:50]}...")
  62. # 验证新token
  63. payload = verify_token(new_token)
  64. if payload:
  65. print(f"✅ 新Token验证成功: 用户={payload.get('username')}")
  66. print(f" 新过期时间: {datetime.fromtimestamp(payload.get('exp'), tz=timezone.utc)}")
  67. else:
  68. print("❌ 新Token验证失败")
  69. return new_token
  70. else:
  71. print("❌ Token刷新失败")
  72. return None
  73. def test_config_loading():
  74. """测试配置加载"""
  75. print("\n🧪 测试4: 配置加载")
  76. admin_expire = config_handler.get_int("admin_app", "ADMIN_TOKEN_EXPIRE_MINUTES", None)
  77. access_expire = config_handler.get_int("admin_app", "ACCESS_TOKEN_EXPIRE_MINUTES", 30)
  78. refresh_expire = config_handler.get_int("admin_app", "ADMIN_REFRESH_TOKEN_EXPIRE_HOURS", None)
  79. print(f"✅ 后台管理Token过期时间: {admin_expire} 分钟")
  80. print(f"✅ 通用Token过期时间: {access_expire} 分钟")
  81. print(f"✅ 刷新Token过期时间: {refresh_expire} 小时")
  82. # 显示实际使用的过期时间
  83. actual_expire = admin_expire if admin_expire is not None else access_expire
  84. print(f"🎯 实际使用的过期时间: {actual_expire} 分钟")
  85. def simulate_user_activity():
  86. """模拟用户活动场景"""
  87. print("\n🧪 测试5: 模拟用户活动场景")
  88. # 创建初始token
  89. test_data = {
  90. "sub": "active_user_456",
  91. "username": "activeuser",
  92. "email": "active@example.com",
  93. "is_superuser": True
  94. }
  95. current_token = create_access_token(test_data)
  96. print(f"📅 初始Token创建: {datetime.now()}")
  97. # 模拟多次API调用
  98. for i in range(3):
  99. print(f"\n🔄 第{i+1}次API调用:")
  100. payload, new_token = verify_and_refresh_token(current_token)
  101. if payload:
  102. print(f" ✅ 验证成功: {payload.get('username')}")
  103. if new_token:
  104. print(f" 🔄 Token已刷新")
  105. current_token = new_token
  106. else:
  107. print(f" ℹ️ Token无需刷新")
  108. else:
  109. print(f" ❌ 验证失败")
  110. break
  111. # 模拟时间间隔
  112. import time
  113. time.sleep(1)
  114. return current_token
  115. def main():
  116. """主测试函数"""
  117. print("🚀 开始测试滑动过期Token机制")
  118. print("=" * 60)
  119. try:
  120. # 测试配置加载
  121. test_config_loading()
  122. # 测试token创建
  123. token = test_token_creation()
  124. if not token:
  125. print("❌ Token创建失败,终止测试")
  126. return
  127. # 测试滑动过期
  128. token = test_sliding_expiration(token)
  129. if not token:
  130. print("❌ 滑动过期测试失败,终止测试")
  131. return
  132. # 测试token刷新
  133. new_token = test_token_refresh(token)
  134. if not new_token:
  135. print("❌ Token刷新测试失败")
  136. # 模拟用户活动
  137. simulate_user_activity()
  138. print("\n" + "=" * 60)
  139. print("🎉 所有测试完成!")
  140. except Exception as e:
  141. print(f"\n❌ 测试过程中发生错误: {e}")
  142. import traceback
  143. traceback.print_exc()
  144. if __name__ == "__main__":
  145. main()