如何在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中文網其他相關文章!