使用FastAPIJWT構建Web應用的鑒權系統

在Web應用開發中,鑒權系統是必不可少的一個環節。FastAPIJWT是使用JSON Web Token(以下簡稱JWT)在FastAPI中構建鑒權系統的一種簡單、快速但功能強大的方法。JWT是一種開放標準(RFC 7519),用於在網路應用之間傳遞聲明。JWT中的信息使用JSON對象進行編碼,以數字簽名方式進行驗證。

一、在FastAPI中使用FastAPIJWT

在開始使用FastAPIJWT之前,需要使用pip安裝FastAPI和FastAPIJWT庫:

pip install fastapi
pip install fastapi-jwt-auth

接下來,我們需要在FastAPI應用程序中添加FastAPIJWT的配置項和路由以啟用鑒權系統。

在應用程序的主文件中,導入FastAPI、FastAPIJWT庫並創建應用程序實例:

from fastapi import FastAPI
from fastapi_jwt_auth import AuthJWT

app = FastAPI()

接下來,我們需要配置FastAPIJWT並在應用程序中註冊路由以處理jwt相關的請求。這裡我們使用AuthJWT裝飾器,該裝飾器接受應用程序實例作為參數。配置中我們需要設置SECRET_KEY、ACCESS_TOKEN_EXPIRE_MINUTES和ALGORITHM參數,在路由中我們可以通過AuthJWT.current_user()方法獲取當前用戶的信息:

# 必須設置的Secret Key以進行JWT加密和解密
app.config["SECRET_KEY"] = "your-secret-key"

# JWT過期時間(分鐘)
app.config["ACCESS_TOKEN_EXPIRE_MINUTES"] = 30

# JWT演算法
app.config["ALGORITHM"] = "HS256"

# JWT鑒權路由
@app.post("/login")
def login(auth: AuthJWT = Depends()):
    # 獲取用戶名和密碼
    username = form_data.username
    password = form_data.password

    # 驗證用戶
    is_authenticated = verify_user(username, password)
    if is_authenticated:
        # 創建JWT令牌
        access_token = auth.create_access_token(subject=username)
        return {"access_token": access_token}
    else:
        raise HTTPException(status_code=400, detail="Incorrect username or password")

@app.get("/protected")
def protected_route(user: User = Depends(get_current_user)):
    return {"message": "Hello, {0}!".format(user.username)}

在上面的示例中,我們使用了兩個路由:/login和/protected。在/login路由中,我們獲取用戶的用戶名和密碼,並驗證用戶身份。如果用戶身份驗證成功,則調用AuthJWT.create_access_token()方法生成JWT令牌並返回給客戶端。在/protected路由中,我們使用@Depends裝飾器中的get_current_user方法來保護該路由。

二、使用FastAPIJWT保護路由

在上一節中,我們已經使用FastAPIJWT創建了鑒權系統。在本節中,我們將使用FastAPIJWT來保護我們的路由,僅允許經過身份驗證的用戶訪問。

首先,我們需要創建一個獲取當前用戶的函數(也稱為依賴項),該函數將在路由中使用。

from fastapi_jwt_auth import AuthJWTfrom fastapi.security import HTTPBearer, HTTPAuthorizationCredentialsfrom fastapi import Dependsjwt_scheme = HTTPBearer()# 獲取當前用戶的函數def get_current_user(auth: HTTPAuthorizationCredentials = Depends(jwt_scheme), jwt: AuthJWT = Depends()):    try:        # 調用AuthJWT.verify_token()方法驗證token並返回用戶信息        jwt.verify_token(auth.credentials)        current_user = jwt.get_jwt_subject()    except:        # 驗證失敗時拋出HTTPException        raise HTTPException(status_code=401, detail="Invalid token")    return {"username": current_user}

在上述get_current_user方法中,我們使用@Depends裝飾器指定了兩個依賴項:auth和jwt。其中auth參數的值為FastAPI的HTTPBearer OAuth類型,用於獲取HTTP頭部中的JWT密碼。jwt參數的值為AuthJWT實例,用於驗證JWT密碼和獲取JWT主題(即用戶標識符)。如果驗證成功,則返回包含用戶名的JSON對象。如果驗證失敗,則返回401 UnauthorizedHTTPException。接下來,我們可以在要保護的路由中使用該get_current_user方法。

# 保護路由
@app.get("/protected")
def protected_route(user: User = Depends(get_current_user)):
    return {"message": "Hello, {0}!".format(user.username)}

在上述示例中,我們使用fastapi的@Depends裝飾器來指定get_current_user方法作為get_protected_route路由的依賴項。如果用戶通過身份驗證,則返回包含用戶信息的JSON對象。如果用戶未通過身份驗證,則返回401 Unauthorized HTTPException。

三、使用Refresh Token實現JWT自動續期

JWT的過期時間是有限的。但是,如果用戶一直在使用應用程序,他們可能希望在該時間段內自動續訂他們的JWT。為了實現這一點,FastAPIJWT提供了一個自動續訂機制,該機制使用Refresh Token。

在FastAPIJWT中,Refresh Token是一種與訪問令牌(access token)相關的短暫的JWT。Refresh Token創建後的短暫有效期內可以用來獲取新的訪問令牌,從而允許用戶無縫延長訪問令牌的有效期。

要使用Refresh Token,請指定一個可選的REFRESH_TOKEN_EXPIRE_MINUTES選項,該選項指定Refresh Token的過期時間。以下是實現JWT自動續期的示例:

# JWT自動續訂路由
@app.post("/refresh")
def refresh_token(authorize: AuthJWT = Depends()):
    # 驗證Refresh Token
    authorize.jwt_refresh_token_required()

    # 創建新的AccessToken
    current_user = authorize.get_jwt_subject()
    new_access_token = authorize.create_access_token(subject=current_user)

    # 返回新的AccessToken
    return {"access_token": new_access_token, "refresh_token": authorize.create_refresh_token(subject=current_user)}

在上述示例中,我們使用AuthJWT裝飾器和create_refresh_token()方法創建了Refresh Token。如果Refresh Token存在且有效,則可以調用create_access_token()方法創建新的Access Token。

此時,我們需要相應地更新前一節中的login()路由和get_current_user()函數。

# Login路由
@app.post("/login")
def login(form_data: LoginForm, authorize: AuthJWT = Depends()):
    # 獲取用戶名和密碼
    username = form_data.username
    password = form_data.password

    # 驗證用戶
    is_authenticated = verify_user(username, password)
    if is_authenticated:
        # 創建JWT令牌和Refresh Token
        access_token = authorize.create_access_token(subject=username)
        refresh_token = authorize.create_refresh_token(subject=username)
        return {"access_token": access_token, "refresh_token": refresh_token}
    else:
        raise HTTPException(status_code=400, detail="Incorrect username or password")

# 獲取當前用戶的函數
def get_current_user(authorize: AuthJWT = Depends()):
    try:
        # 調用AuthJWT.refresh_jwt_token()方法來刷新Token
        authorize.jwt_refresh_token_required()
        authorize.refresh_jwt_token()
        current_user = authorize.get_jwt_subject()
    except:
        # 驗證失敗時拋出HTTPException
        raise HTTPException(status_code=401, detail="Invalid token")

    return {"username": current_user}

在上述示例中,我們使用AuthJWT.refresh_jwt_token()方法來刷新JWT。如果Refresh Token有效,則會自動創建新的Access Token並返回給客戶端。

四、結語

到目前為止,我們已經使用FastAPIJWT構建了一個功能齊全的Web應用程序鑒權系統,實現了訪問控制和自動續訂功能。FastAPIJWT是使用FastAPI創建鑒權系統的最佳選擇之一,因為它結合了FastAPI的速度和易用性,以及JWT提供的強大的安全保障。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/253894.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-14 02:19
下一篇 2024-12-14 02:19

相關推薦

  • Deepin系統分區設置教程

    本教程將會詳細介紹Deepin系統如何進行分區設置,分享多種方式讓您了解如何規劃您的硬碟。 一、分區的基本知識 在進行Deepin系統分區設置之前,我們需要了解一些基本分區概念。 …

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • 如何在樹莓派上安裝Windows 7系統?

    隨著樹莓派的普及,許多用戶想在樹莓派上安裝Windows 7操作系統。 一、準備工作 在開始之前,需要準備以下材料: 1.樹莓派4B一台; 2.一張8GB以上的SD卡; 3.下載並…

    編程 2025-04-29
  • Python Web開發第三方庫

    本文將介紹Python Web開發中的第三方庫,包括但不限於Flask、Django、Bottle等,並討論它們的優缺點和應用場景。 一、Flask Flask是一款輕量級的Web…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟體開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • 分銷系統開發搭建

    本文主要介紹如何搭建一套完整的分銷系統,從需求分析、技術選型、開發、部署等方面進行說明。 一、需求分析 在進行分銷系統的開發之前,我們首先需要對系統進行需求分析。一般來說,分銷系統…

    編程 2025-04-29
  • 雲盤開源系統哪個好?

    本文將會介紹幾種目前主流的雲盤開源系統,從不同方面對它們做出分析比較,以此來確定哪個雲盤開源系統是最適合您的。 一、Seafile Seafile是一款非常出色的雲盤開源系統,它的…

    編程 2025-04-28
  • EulerOS V2R7:企業級開發首選系統

    本文將從多個方面為您介紹EulerOS V2R7,包括系統簡介、安全性、易用性、靈活性和應用場景等。 一、系統簡介 EulerOS V2R7是一個華為公司開發的企業級操作系統,該系…

    編程 2025-04-28
  • 基於Python點餐系統的實現

    在當前瞬息萬變的社會,餐飲行業也在加速發展,如何更好地為客戶提供更加便捷、高效、個性化的點餐服務,成為每個餐飲企業需要思考的問題。本文以基於Python的點餐系統為例,通過優化用戶…

    編程 2025-04-28
  • Python操作Web頁面

    本文將從多個方面詳細介紹Python操作Web頁面的技巧、方法和注意事項。 一、安裝必要的庫 在Python中操作Web頁面,需要用到一些第三方庫。 pip install req…

    編程 2025-04-28

發表回復

登錄後才能評論