ホームページ >バックエンド開発 >Python チュートリアル >FastAPI でユーザー認証と認可を実装する方法

FastAPI でユーザー認証と認可を実装する方法

WBOY
WBOYオリジナル
2023-07-28 21:44:054282ブラウズ

FastAPI でユーザー認証と認可を実装する方法

FastAPI は、非同期サポート、自動ドキュメント生成、型ヒントなどの多くの強力な機能を提供する、Python ベースの高性能 Web フレームワークです。最新の Web アプリケーションでは、ユーザーの認証と認可は、アプリケーションのセキュリティを保護できる非常に重要な機能です。この記事では、FastAPI でユーザーの認証と認可を実装する方法を説明します。

  1. 必要なライブラリをインストールする

始める前に、まず必要なライブラリをインストールする必要があります。 FastAPI では、通常、JSON Web トークンの処理に PyJWT ライブラリが使用され、パスワードのハッシュ化と検証に 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. 認証および認可ミドルウェアの実装

ユーザー登録およびログイン インターフェイスを実装したので、次に 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}"}
  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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。