From f41ca9e5dc78baa5a50c32ed05c05876266c6dd4 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期六, 12 十月 2024 14:24:18 +0800 Subject: [PATCH] 对话的token从url传 --- app/api/__init__.py | 61 ++++++++++++++++++++++++++++++ 1 files changed, 60 insertions(+), 1 deletions(-) diff --git a/app/api/__init__.py b/app/api/__init__.py index bcd5c2a..51c31da 100644 --- a/app/api/__init__.py +++ b/app/api/__init__.py @@ -1,10 +1,69 @@ -from fastapi import FastAPI +import jwt +from fastapi import FastAPI, Depends, HTTPException +from fastapi.security import OAuth2PasswordBearer +from passlib.context import CryptContext from pydantic import BaseModel +from starlette import status +from starlette.websockets import WebSocket, WebSocketDisconnect + +from app.models.user_model import UserModel +from app.service.auth import SECRET_KEY, ALGORITHM app = FastAPI() + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") class Response(BaseModel): code: int = 200 msg: str = "" data: dict = {} + + +def get_current_user(token: str = Depends(oauth2_scheme)): + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + username: str = payload.get("sub") + if username is None: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="鏃犳硶楠岃瘉鍑瘉", + headers={"WWW-Authenticate": "Bearer"}, + ) + user = UserModel(username=username, id=payload.get("user_id")) + if user.id == 0: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="鐢ㄦ埛涓嶅瓨鍦�", + headers={"WWW-Authenticate": "Bearer"}, + ) + return user + except jwt.PyJWTError: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="浠ょ墝鏃犳晥鎴栧凡杩囨湡", + headers={"WWW-Authenticate": "Bearer"}, + ) + + +async def get_current_user_websocket(websocket: WebSocket): + token = websocket.query_params.get('token') + if token is None: + await websocket.close(code=1008) + raise WebSocketDisconnect(code=status.WS_1008_POLICY_VIOLATION) + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + username: str = payload.get("sub") + if username is None: + await websocket.close(code=1008) + raise WebSocketDisconnect(code=status.WS_1008_POLICY_VIOLATION) + user = UserModel(username=username, id=payload.get("user_id")) + if user is None: + await websocket.close(code=1008) + raise WebSocketDisconnect(code=status.WS_1008_POLICY_VIOLATION) + return user + except jwt.PyJWTError as e: + print(e) + await websocket.close(code=1008) + raise WebSocketDisconnect(code=status.WS_1008_POLICY_VIOLATION) \ No newline at end of file -- Gitblit v1.8.0