FastAPI でユーザー認証と認可を実装する方法
FastAPI は、非同期サポート、自動ドキュメント生成、型ヒントなどの多くの強力な機能を提供する、Python ベースの高性能 Web フレームワークです。最新の Web アプリケーションでは、ユーザーの認証と認可は、アプリケーションのセキュリティを保護できる非常に重要な機能です。この記事では、FastAPI でユーザーの認証と認可を実装する方法を説明します。
始める前に、まず必要なライブラリをインストールする必要があります。 FastAPI では、通常、JSON Web トークンの処理に PyJWT ライブラリが使用され、パスワードのハッシュ化と検証に 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"}
ユーザー登録およびログイン インターフェイスを実装したので、次に ID を実装する必要があります。認証および認可ミドルウェア。これにより、有効なトークンが提供された場合にのみ、ユーザーが保護されたルートにアクセスできるようになります。
以下は、認証および認可ミドルウェアの実装例です:
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 中国語 Web サイトの他の関連記事を参照してください。