在之前的分享的中,產生了token,用于做登錄的認證,那么產生了token后,登陸攜帶了token,我們如何校驗呢?
我們先來梳理下邏輯,
1.呼叫登錄介面,產生token 2.呼叫依賴登錄的介面,在請求頭中攜帶token 3.依賴登錄的介面,接受到請求,判斷是否在headers中攜帶token 4.攜帶token,校驗是否過期 5.決議token,獲取username 6.根據username從redis獲取, 7.查詢到username的token且token相等,我們任務用戶登錄 8.呼叫介面回傳資料 9.如果有其中一項校驗不通過,回傳對應的失敗的資訊
上面,我們梳理了思路,接下來我們就是去實作了,
我們先來實作從heders中獲取token并且校驗是否在redis有這個token,
async def get_cure_user(request: Request, token: Optional[str] = Header(...)) -> UserBase: #token依賴請求頭的token校驗 #驗證失敗回傳資訊 credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="驗證失敗" ) #未登錄失效的資訊 credentials_FOR_exception = HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="用戶未登錄或者登陸token已經失效" ) try: #決議token payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) #獲取username username: str = payload.get("sub") #沒有決議出來username if username is None: raise credentials_exception #從redis獲取用戶token useris = await request.app.state.redis.get(username) #token存在且存盤的token一致認為成功 if not useris and useris!=token: raise credentials_FOR_exception #回傳用戶資訊 user = UserBase(email=username) return user except JWTError: raise credentials_exception
UserBase類如下,存放在schemas中
from pydantic import BaseModel class UserBase(BaseModel): email: str
那么我們下面之前獲取用戶資訊的時候,需要依賴登錄,回傳當前用戶資訊
@usersRouter.get("/user/getcuruser", response_model=Users) def getuser(users: UserBase = Depends(get_cure_user), db: Session = Depends(get_db)): user = get_user_emai(db, users.email) return user
那么我們去測驗下,我們的設想是否實作,
沒有攜帶token

那么我們呼叫下登錄,

攜帶了token后就回傳了當前用戶的資訊,這樣我們可以把這個登錄的認證,帶入到其他的需要登錄才能請求的介面中,
代碼存盤
https://gitee.com/liwanlei/fastapistuday
文章首發在公眾號,歡迎關注,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/338932.html
標籤:其他
上一篇:大一C語言學習筆記(6)---自省篇--流程控制;break,continue,return間的異同;陣列應用到回圈陳述句中需要注意的問題;++i 和 i++的異同等。
