__init__.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import jwt
  2. from fastapi import FastAPI, Depends, HTTPException
  3. from fastapi.security import OAuth2PasswordBearer
  4. from passlib.context import CryptContext
  5. from pydantic import BaseModel
  6. from starlette import status
  7. from starlette.websockets import WebSocket, WebSocketDisconnect
  8. from app.models.user_model import UserModel
  9. from app.service.auth import SECRET_KEY, ALGORITHM
  10. app = FastAPI()
  11. pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
  12. oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
  13. class Response(BaseModel):
  14. code: int = 200
  15. msg: str = ""
  16. data: dict = {}
  17. class ResponseList(BaseModel):
  18. code: int = 200
  19. msg: str = ""
  20. data: list[dict] = []
  21. def get_current_user(token: str = Depends(oauth2_scheme)):
  22. try:
  23. payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
  24. username: str = payload.get("sub")
  25. if username is None:
  26. raise HTTPException(
  27. status_code=status.HTTP_401_UNAUTHORIZED,
  28. detail="无法验证凭证",
  29. headers={"WWW-Authenticate": "Bearer"},
  30. )
  31. user = UserModel(username=username, id=payload.get("user_id"))
  32. if user.id == 0:
  33. raise HTTPException(
  34. status_code=status.HTTP_401_UNAUTHORIZED,
  35. detail="用户不存在",
  36. headers={"WWW-Authenticate": "Bearer"},
  37. )
  38. return user
  39. except jwt.PyJWTError:
  40. raise HTTPException(
  41. status_code=status.HTTP_401_UNAUTHORIZED,
  42. detail="令牌无效或已过期",
  43. headers={"WWW-Authenticate": "Bearer"},
  44. )
  45. async def get_current_user_websocket(websocket: WebSocket):
  46. token = websocket.query_params.get('token')
  47. if token is None:
  48. await websocket.close(code=1008)
  49. raise WebSocketDisconnect(code=status.WS_1008_POLICY_VIOLATION)
  50. try:
  51. payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
  52. username: str = payload.get("sub")
  53. if username is None:
  54. await websocket.close(code=1008)
  55. raise WebSocketDisconnect(code=status.WS_1008_POLICY_VIOLATION)
  56. user = UserModel(username=username, id=payload.get("user_id"))
  57. if user is None:
  58. await websocket.close(code=1008)
  59. raise WebSocketDisconnect(code=status.WS_1008_POLICY_VIOLATION)
  60. return user
  61. except jwt.PyJWTError as e:
  62. print(e)
  63. await websocket.close(code=1008)
  64. raise WebSocketDisconnect(code=status.WS_1008_POLICY_VIOLATION)