首頁  >  文章  >  後端開發  >  如何在FastAPI中實現使用者身份驗證和授權

如何在FastAPI中實現使用者身份驗證和授權

WBOY
WBOY原創
2023-07-28 21:44:054175瀏覽

如何在FastAPI中實現使用者驗證和授權

FastAPI 是一個基於Python的高效能Web框架,它提供了許多強大的功能,例如非同步支援、自動文件生成和類型提示。在現代網路應用程式中,使用者身份驗證和授權是一個非常重要的功能,它們能夠保護應用程式的安全性。在本文中,我們將探討如何在FastAPI中實現使用者身份驗證和授權。

  1. 安裝所需的函式庫

在開始之前,我們要先安裝所需的函式庫。在FastAPI中,通常使用PyJWT函式庫來處理JSON Web Tokens,使用Passlib函式庫來進行密碼雜湊和驗證。我們可以使用以下命令來安裝這些函式庫:

pip install fastapi pyjwt passlib
  1. 建立使用者模型

在我們開始實作驗證和授權之前,我們需要定義一個使用者模型。使用者模型通常包含使用者名稱、密碼等欄位。以下是一個範例使用者模型的定義:

from pydantic import BaseModel

class User(BaseModel):
    username: str
    password: str
  1. 實作使用者註冊和登入介面

接下來,我們需要實作使用者註冊和登入介面。在註冊介面中,我們將取得使用者名稱和密碼,並將密碼進行雜湊處理後儲存到資料庫中。在登入介面中,我們將驗證使用者提供的使用者名稱和密碼是否與資料庫中的相符。以下是一個範例的實作:

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"}
  1. 實作身份驗證和授權中間件

現在我們已經實作了使用者註冊和登入接口,接下來我們需要實作身份驗證和授權的中間件。這將確保只有在提供有效的令牌的情況下,使用者才能存取受保護的路由。

以下是一個範例的驗證和授權中間件的實作:

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}"}
  1. #產生和驗證令牌

最後,我們需要實作一個方法來產生令牌。令牌是一種用於身份驗證和授權的安全憑證。在使用者成功登入後,我們可以使用該方法產生一個令牌,並將其傳回給客戶端。

以下是一個範例方法來產生和驗證令牌的實作:

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn