generate_admin_token.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #!/usr/bin/env python3
  2. """
  3. 生成长期有效的管理员Token脚本
  4. 功能:
  5. 1. 查找管理员用户
  6. 2. 生成99999天有效期的Token
  7. 3. 输出Token并验证有效性
  8. 使用方式:
  9. cd backend
  10. python scripts/generate_admin_token.py
  11. 注意:需要在backend目录下运行,以确保正确加载配置
  12. """
  13. import sys
  14. import os
  15. # 添加backend目录到路径
  16. sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  17. from datetime import datetime, timedelta
  18. import jwt
  19. from config import settings
  20. from database import get_db_connection
  21. def find_admin_user():
  22. """查找管理员用户"""
  23. with get_db_connection() as conn:
  24. cursor = conn.cursor()
  25. cursor.execute("""
  26. SELECT id, username, email, role
  27. FROM users
  28. WHERE role = 'admin'
  29. LIMIT 1
  30. """)
  31. row = cursor.fetchone()
  32. if row:
  33. return {
  34. "id": row["id"],
  35. "username": row["username"],
  36. "email": row["email"],
  37. "role": row["role"]
  38. }
  39. return None
  40. def create_long_term_token(user_data: dict, days: int = 99999) -> str:
  41. """
  42. 创建长期有效的Token
  43. Args:
  44. user_data: 用户信息字典
  45. days: 有效天数,默认99999天
  46. Returns:
  47. str: JWT Token
  48. """
  49. expire = datetime.utcnow() + timedelta(days=days)
  50. payload = {
  51. "sub": user_data["id"],
  52. "username": user_data["username"],
  53. "email": user_data["email"],
  54. "role": user_data["role"],
  55. "exp": expire,
  56. "iat": datetime.utcnow(),
  57. "type": "access"
  58. }
  59. return jwt.encode(
  60. payload,
  61. settings.JWT_SECRET_KEY,
  62. algorithm=settings.JWT_ALGORITHM
  63. )
  64. def verify_token(token: str) -> dict:
  65. """
  66. 验证Token有效性
  67. Args:
  68. token: JWT Token
  69. Returns:
  70. dict: 解码后的payload
  71. """
  72. try:
  73. payload = jwt.decode(
  74. token,
  75. settings.JWT_SECRET_KEY,
  76. algorithms=[settings.JWT_ALGORITHM]
  77. )
  78. return payload
  79. except jwt.ExpiredSignatureError:
  80. raise Exception("Token已过期")
  81. except jwt.InvalidTokenError as e:
  82. raise Exception(f"Token无效: {str(e)}")
  83. def main():
  84. print("=" * 60)
  85. print("管理员长期Token生成工具")
  86. print("=" * 60)
  87. print()
  88. # 查找管理员用户
  89. print("正在查找管理员用户...")
  90. admin_user = find_admin_user()
  91. if not admin_user:
  92. print("\n❌ 错误: 未找到管理员用户!")
  93. print("\n请先创建管理员用户,可以使用以下方式:")
  94. print(" 1. 运行 python create_test_user.py 创建测试用户")
  95. print(" 2. 或通过API注册用户后在数据库中将role改为admin")
  96. sys.exit(1)
  97. print(f"✓ 找到管理员用户: {admin_user['username']} ({admin_user['email']})")
  98. print()
  99. # 生成Token
  100. print("正在生成99999天有效期的Token...")
  101. token = create_long_term_token(admin_user, days=99999)
  102. print("✓ Token生成成功!")
  103. print()
  104. # 验证Token
  105. print("正在验证Token有效性...")
  106. try:
  107. payload = verify_token(token)
  108. expire_time = datetime.fromtimestamp(payload["exp"])
  109. print(f"✓ Token验证通过!")
  110. print(f" - 用户ID: {payload['sub']}")
  111. print(f" - 用户名: {payload['username']}")
  112. print(f" - 角色: {payload['role']}")
  113. print(f" - 过期时间: {expire_time.strftime('%Y-%m-%d %H:%M:%S')}")
  114. except Exception as e:
  115. print(f"❌ Token验证失败: {str(e)}")
  116. sys.exit(1)
  117. print()
  118. print("=" * 60)
  119. print("生成的管理员Token (请妥善保管):")
  120. print("=" * 60)
  121. print()
  122. print(token)
  123. print()
  124. print("=" * 60)
  125. print()
  126. print("使用方式:")
  127. print(" 在HTTP请求头中添加:")
  128. print(f" Authorization: Bearer {token[:50]}...")
  129. print()
  130. if __name__ == "__main__":
  131. main()