如何在FastAPI中實現使用者身份驗證和授權
如何在FastAPI中實現使用者驗證和授權
FastAPI 是一個基於Python的高效能Web框架,它提供了許多強大的功能,例如非同步支援、自動文件生成和類型提示。在現代網路應用程式中,使用者身份驗證和授權是一個非常重要的功能,它們能夠保護應用程式的安全性。在本文中,我們將探討如何在FastAPI中實現使用者身份驗證和授權。
- 安裝所需的函式庫
在開始之前,我們要先安裝所需的函式庫。在FastAPI中,通常使用PyJWT函式庫來處理JSON Web Tokens,使用Passlib函式庫來進行密碼雜湊和驗證。我們可以使用以下命令來安裝這些函式庫:
pip install fastapi pyjwt passlib
- 建立使用者模型
在我們開始實作驗證和授權之前,我們需要定義一個使用者模型。使用者模型通常包含使用者名稱、密碼等欄位。以下是一個範例使用者模型的定義:
from pydantic import BaseModel class User(BaseModel): username: str password: str
- 實作使用者註冊和登入介面
接下來,我們需要實作使用者註冊和登入介面。在註冊介面中,我們將取得使用者名稱和密碼,並將密碼進行雜湊處理後儲存到資料庫中。在登入介面中,我們將驗證使用者提供的使用者名稱和密碼是否與資料庫中的相符。以下是一個範例的實作:
from fastapi import FastAPI from passlib.hash import bcrypt app = FastAPI() DATABASE = [] @app.post("/register") def register_user(user: User): # Hash password hashed_password = bcrypt.hash(user.password) # Save user to database DATABASE.append({"username": user.username, "password": hashed_password}) return {"message": "User registered successfully"} @app.post("/login") def login_user(user: User): # Find user in database for data in DATABASE: if data["username"] == user.username: # Check password if bcrypt.verify(user.password, data["password"]): return {"message": "User logged in successfully"} return {"message": "Invalid username or password"}
- 實作身份驗證和授權中間件
現在我們已經實作了使用者註冊和登入接口,接下來我們需要實作身份驗證和授權的中間件。這將確保只有在提供有效的令牌的情況下,使用者才能存取受保護的路由。
以下是一個範例的驗證和授權中間件的實作:
from fastapi import FastAPI, Depends, HTTPException, status from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from passlib.hash import bcrypt from jose import jwt, JWTError app = FastAPI() SECRET_KEY = "your-secret-key" security = HTTPBearer() @app.post("/register") def register_user(user: User): # ... @app.post("/login") def login_user(user: User): # ... def get_current_user(credentials: HTTPAuthorizationCredentials = Depends(security)): try: token = credentials.credentials payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"]) user = payload.get("username") return user except JWTError: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token", headers={"WWW-Authenticate": "Bearer"}, ) @app.get("/protected") def protected_route(current_user: str = Depends(get_current_user)): return {"message": f"Hello, {current_user}"}
- #產生和驗證令牌
最後,我們需要實作一個方法來產生令牌。令牌是一種用於身份驗證和授權的安全憑證。在使用者成功登入後,我們可以使用該方法產生一個令牌,並將其傳回給客戶端。
以下是一個範例方法來產生和驗證令牌的實作:
from fastapi import FastAPI, Depends, HTTPException, status from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from passlib.hash import bcrypt from jose import jwt, JWTError, ExpiredSignatureError from datetime import datetime, timedelta app = FastAPI() SECRET_KEY = "your-secret-key" ALGORITHM = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES = 30 security = HTTPBearer() @app.post("/register") def register_user(user: User): # ... @app.post("/login") def login_user(user: User): # ... def get_current_user(credentials: HTTPAuthorizationCredentials = Depends(security)): try: token = credentials.credentials payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) user = payload.get("username") return user except JWTError: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token", headers={"WWW-Authenticate": "Bearer"}, ) def create_access_token(username: str): expires = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) payload = {"username": username, "exp": expires} token = jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM) return token @app.get("/protected") def protected_route(current_user: str = Depends(get_current_user)): return {"message": f"Hello, {current_user}"} @app.post("/token") def get_access_token(user: User): # Check username and password for data in DATABASE: if data["username"] == user.username: if bcrypt.verify(user.password, data["password"]): # Generate access token access_token = create_access_token(user.username) return {"access_token": access_token} raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid username or password", headers={"WWW-Authenticate": "Bearer"}, )
綜上所述,我們已經了解如何在FastAPI中實現使用者驗證和授權。透過使用PyJWT庫和Passlib庫,我們能夠安全地處理使用者憑證並保護應用程式的安全性。這些範例程式碼可作為起點,您可以根據自己的需求進行進一步的客製化和擴展。希望這篇文章對您有幫助!
以上是如何在FastAPI中實現使用者身份驗證和授權的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版