auth_middleware.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from fastapi import Request, HTTPException, status
  2. from fastapi.responses import JSONResponse
  3. from .token import verify_local_token
  4. from .logger import logger
  5. async def auth_middleware(request: Request, call_next):
  6. """Token认证中间件"""
  7. # 白名单路径(不需要认证)
  8. whitelist_paths = [
  9. "/",
  10. "/health",
  11. "/docs",
  12. "/redoc",
  13. "/openapi.json",
  14. "/static",
  15. "/assets",
  16. "/apiv1/auth/local_login",
  17. "/apiv1/auth/register"
  18. ]
  19. # 检查是否在白名单中
  20. path = request.url.path
  21. for whitelist_path in whitelist_paths:
  22. if path.startswith(whitelist_path):
  23. # 白名单路径也设置一个默认user,避免后续访问出错
  24. request.state.user = None
  25. return await call_next(request)
  26. # 获取Token
  27. token = request.headers.get("token") or request.headers.get(
  28. "Authorization", "").replace("Bearer ", "")
  29. logger.info(f"认证中间件 - 路径: {path}")
  30. logger.info(f"认证中间件 - Token (前20字符): {token[:20] if token else 'None'}...")
  31. if not token:
  32. logger.warning("认证中间件 - 未提供Token")
  33. return JSONResponse(
  34. status_code=status.HTTP_401_UNAUTHORIZED,
  35. content={"code": 401, "msg": "未提供认证Token"}
  36. )
  37. # 验证Token
  38. logger.info("认证中间件 - 开始验证Token")
  39. user_info = await verify_local_token(token)
  40. if not user_info:
  41. logger.error("认证中间件 - Token验证失败,返回401")
  42. return JSONResponse(
  43. status_code=status.HTTP_401_UNAUTHORIZED,
  44. content={"code": 401, "msg": "Token验证失败"}
  45. )
  46. logger.info(
  47. f"认证中间件 - Token验证成功,用户: {user_info.username} ({user_info.account})")
  48. # 将用户信息存储到request.state中
  49. request.state.user = user_info
  50. response = await call_next(request)
  51. return response