如何在FastAPI中實現請求的身份驗證和授權

王林
發布: 2023-07-29 16:39:20
原創
1552 人瀏覽過

如何在FastAPI中實現請求的身份驗證和授權

隨著互聯網的發展,網路安全問題越來越受到關注。在開發Web應用程式時,請求身份驗證和授權是確保應用程式安全的重要環節。本文將介紹如何在FastAPI框架中實現請求的身份驗證和授權。

FastAPI是一個基於Python的高效能Web框架,它提供了一種簡單而強大的方式來建立Web API。它整合了Pydantic庫和Starlette框架,使得開發過程更加輕鬆和有效率。

  1. 安裝相依性

首先,我們需要安裝FastAPI和對應的依賴。可以透過以下命令來安裝:

$ pip install fastapi
$ pip install uvicorn
登入後複製
  1. 創建基本應用程式

接下來,我們創建一個簡單的FastAPI應用程序,並添加一些基本的路由和端點。在這個範例中,我們將建立一個名為"app.py"的文件,並將以下程式碼複製到其中:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}
登入後複製
  1. 新增身份驗證和授權

#接下來,我們將介紹如何使用FastAPI的安全功能來實現請求的身份驗證和授權。我們將使用OAuth2.0作為身份驗證和授權的機制。

首先,我們需要導入相關的模組和類別:

from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from passlib.context import CryptContext
登入後複製

然後,我們建立一個密碼加密上下文:

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
登入後複製

接下來,我們定義一個使用者模型,用於驗證使用者身份:

class User:
    def __init__(self, username: str, password: str, disabled: bool = False):
        self.username = username
        self.password = pwd_context.hash(password)
        self.disabled = disabled

    def verify_password(self, password: str):
        return pwd_context.verify(password, self.password)

    def get_user(self, username: str):
        if self.username == username:
            return self
登入後複製

然後,我們建立一個虛擬資料庫,並添加一些使用者信息,用於測試目的:

fake_db = [
    User(username="user1", password="password"),
    User(username="user2", password="password", disabled=True)
]
登入後複製

接下來,我們定義一個函數來驗證使用者的憑證:

def authenticate_user(username: str, password: str):
    user = get_user(username)
    if not user:
        return False
    if not user.verify_password(password):
        return False
    return user
登入後複製

然後,我們定義一個函數來取得目前使用者:

def get_current_user(token: str = Depends(oauth2_scheme)):
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Could not validate credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )
    user = authenticate_user(token)
    if not user:
        raise credentials_exception
    return user
登入後複製

最後,我們將這些函數應用到FastAPI應用程式:

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")

@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    user = authenticate_user(form_data.username, form_data.password)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid username or password",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return {"access_token": str(user.username), "token_type": "bearer"}

@app.get("/items/")
async def read_items(current_user: User = Depends(get_current_user)):
    return {"items": [{"item_id": "Item 1"}, {"item_id": "Item 2"}]}
登入後複製
  1. #測試應用程式

現在,我們可以運行應用程式並測試它。透過執行以下命令來啟動應用程式:

$ uvicorn app:app --reload
登入後複製

接下來,我們可以使用curl或任何HTTP客戶端工具來測試應用程式。首先,我們需要取得存取權杖:

$ curl --request POST --url http://localhost:8000/token --header 'Content-Type: application/x-www-form-urlencoded' --data 'username=user1&password=password'
登入後複製

收到的回應應該類似於:

{"access_token":"user1","token_type":"bearer"}
登入後複製

然後,我們可以使用得到的存取權杖來存取受限端點:

$ curl --request GET --url http://localhost:8000/items/ --header 'Authorization: Bearer user1'
登入後複製

應該會收到類似如下的回應:

{"items":[{"item_id":"Item 1"},{"item_id":"Item 2"}]}
登入後複製

如此,我們成功地在FastAPI應用程式中實現了請求的身份驗證和授權。

總結:

本文介紹如何在FastAPI框架中實現請求的身份驗證和授權。我們使用了FastAPI的安全功能,並透過OAuth2.0機制來進行身份驗證和授權。透過導入相關的模組和類,建立密碼加密上下文,定義使用者模型和驗證函數,實現了請求的身份驗證功能。最後,我們將這些函數應用到FastAPI應用程式中,並進行了測試。透過這些步驟,我們可以建立一個安全可靠的Web應用程式。

以上是如何在FastAPI中實現請求的身份驗證和授權的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!