v0.1测试
This commit is contained in:
86
backend/utils/jwt_handler.py
Normal file
86
backend/utils/jwt_handler.py
Normal file
@@ -0,0 +1,86 @@
|
||||
# ===========================================
|
||||
# 班级操行分管理系统 - 后端服务
|
||||
#
|
||||
# 开发者: Canglan
|
||||
# 联系方式: admin@sea-studio.top
|
||||
# 版权归属: Sea Network Technology Studio
|
||||
# 许可证: MIT License
|
||||
#
|
||||
# 版权所有 © Sea Network Technology Studio
|
||||
# ===========================================
|
||||
|
||||
from jose import jwt, JWTError
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, Dict, Any
|
||||
|
||||
from config import settings
|
||||
from utils.logger import get_logger
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
class JWTHandler:
|
||||
"""JWT Token处理类"""
|
||||
|
||||
@staticmethod
|
||||
def create_token(user_id: int, username: str, user_type: str, student_id: int = None, role: str = None) -> str:
|
||||
"""
|
||||
创建JWT Token
|
||||
"""
|
||||
payload = {
|
||||
'user_id': user_id,
|
||||
'username': username,
|
||||
'user_type': user_type,
|
||||
'student_id': student_id,
|
||||
'role': role,
|
||||
'exp': datetime.utcnow() + timedelta(minutes=settings.JWT_EXPIRE_MINUTES),
|
||||
'iat': datetime.utcnow(),
|
||||
'iss': settings.APP_NAME
|
||||
}
|
||||
|
||||
token = jwt.encode(
|
||||
payload,
|
||||
settings.JWT_SECRET_KEY,
|
||||
algorithm=settings.JWT_ALGORITHM
|
||||
)
|
||||
return token
|
||||
|
||||
@staticmethod
|
||||
def verify_token(token: str) -> Optional[Dict[str, Any]]:
|
||||
"""
|
||||
验证JWT Token
|
||||
返回: 解码后的payload,失败返回None
|
||||
"""
|
||||
try:
|
||||
payload = jwt.decode(
|
||||
token,
|
||||
settings.JWT_SECRET_KEY,
|
||||
algorithms=[settings.JWT_ALGORITHM],
|
||||
options={'verify_exp': True}
|
||||
)
|
||||
return payload
|
||||
except jwt.ExpiredSignatureError:
|
||||
logger.warning("JWT Token已过期")
|
||||
return None
|
||||
except jwt.JWTError as e:
|
||||
logger.warning(f"JWT Token验证失败: {e}")
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_user_id_from_token(token: str) -> Optional[int]:
|
||||
"""从Token中获取用户ID"""
|
||||
payload = JWTHandler.verify_token(token)
|
||||
if payload:
|
||||
return payload.get('user_id')
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_user_type_from_token(token: str) -> Optional[str]:
|
||||
"""从Token中获取用户类型"""
|
||||
payload = JWTHandler.verify_token(token)
|
||||
if payload:
|
||||
return payload.get('user_type')
|
||||
return None
|
||||
|
||||
|
||||
jwt_handler = JWTHandler()
|
||||
Reference in New Issue
Block a user