Rumah >pembangunan bahagian belakang >Tutorial Python >Cara melaksanakan pengesahan dan kebenaran pengguna dalam FastAPI

Cara melaksanakan pengesahan dan kebenaran pengguna dalam FastAPI

WBOY
WBOYasal
2023-07-28 21:44:054282semak imbas

Cara melaksanakan pengesahan dan kebenaran pengguna dalam FastAPI

FastAPI ialah rangka kerja web berprestasi tinggi berdasarkan Python yang menyediakan banyak ciri berkuasa seperti sokongan tak segerak, penjanaan dokumen automatik dan petunjuk jenis. Dalam aplikasi web moden, pengesahan dan kebenaran pengguna adalah fungsi yang sangat penting yang boleh melindungi keselamatan aplikasi. Dalam artikel ini, kami akan meneroka cara melaksanakan pengesahan dan kebenaran pengguna dalam FastAPI.

  1. Pasang perpustakaan yang diperlukan

Sebelum kita mula, kita perlu memasang perpustakaan yang diperlukan terlebih dahulu. Dalam FastAPI, pustaka PyJWT biasanya digunakan untuk mengendalikan Token Web JSON dan pustaka Passlib digunakan untuk pencincangan kata laluan dan pengesahan. Kita boleh memasang perpustakaan ini menggunakan arahan berikut:

pip install fastapi pyjwt passlib
  1. Cipta Model Pengguna

Sebelum kita mula melaksanakan pengesahan dan kebenaran, kita perlu menentukan model pengguna. Model pengguna biasanya mengandungi medan seperti nama pengguna dan kata laluan. Berikut ialah takrifan contoh model pengguna:

from pydantic import BaseModel

class User(BaseModel):
    username: str
    password: str
  1. Melaksanakan pendaftaran pengguna dan antara muka log masuk

Seterusnya, kita perlu melaksanakan pendaftaran pengguna dan antara muka log masuk. Dalam antara muka pendaftaran, kami akan mendapatkan nama pengguna dan kata laluan, cincang kata laluan dan simpan ke pangkalan data. Dalam antara muka log masuk kami akan mengesahkan bahawa nama pengguna dan kata laluan yang diberikan oleh pengguna sepadan dengan yang terdapat dalam pangkalan data. Berikut ialah contoh pelaksanaan:

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. Melaksanakan perisian tengah pengesahan dan kebenaran

Sekarang kami telah melaksanakan pendaftaran pengguna dan antara muka log masuk, seterusnya kami perlu melaksanakan perisian tengah pengesahan dan kebenaran. Ini akan memastikan bahawa pengguna hanya boleh mengakses laluan yang dilindungi jika token yang sah diberikan.

Berikut ialah contoh pelaksanaan perisian tengah pengesahan dan kebenaran:

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. Menjana dan mengesahkan token

Akhir sekali, kita perlu melaksanakan kaedah untuk menjana token. Token ialah bukti kelayakan keselamatan yang digunakan untuk pengesahan dan kebenaran. Selepas pengguna berjaya log masuk, kami boleh menggunakan kaedah ini untuk menjana token dan mengembalikannya kepada pelanggan.

Berikut ialah pelaksanaan kaedah sampel untuk menjana dan mengesahkan token:

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"},
    )

Untuk meringkaskan, kami telah melihat cara melaksanakan pengesahan dan kebenaran pengguna dalam FastAPI. Dengan menggunakan perpustakaan PyJWT dan perpustakaan Passlib, kami dapat mengendalikan kelayakan pengguna dengan selamat dan melindungi keselamatan aplikasi kami. Kod sampel ini berfungsi sebagai titik permulaan yang boleh anda sesuaikan dan lanjutkan lagi untuk memenuhi keperluan anda. Harap artikel ini membantu anda!

Atas ialah kandungan terperinci Cara melaksanakan pengesahan dan kebenaran pengguna dalam FastAPI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn