Rumah > Artikel > pembangunan bahagian belakang > Cara melaksanakan pengesahan dan kebenaran pengguna dalam FastAPI
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.
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
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
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"}
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}"}
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!