FastAPIとfastapi-usersを用いたユーザー管理の実装

FastAPIとfastapi-usersの概要

FastAPIは、Pythonの非常に高速な(高性能)、使いやすい、モダンな、高速(高性能)なWebフレームワークです。FastAPIは、Python 3.6以降の型ヒントを使用してAPIを構築するためのフレームワークで、これによりエディタのサポート(補完、型チェックなど)が大幅に向上します。

一方、fastapi-usersは、FastAPIアプリケーションのユーザー管理(登録、認証、リカバリなど)を簡単に実装するためのパッケージです。これにより、ユーザー管理に関連する一般的なタスクを効率的に処理することができます。

FastAPIとfastapi-usersを組み合わせることで、ユーザー管理機能を持つ高性能なWebアプリケーションを効率的に構築することが可能になります。

https://fastapi.tiangolo.com/

https://fastapi.tiangolo.com/features/

https://frankie567.github.io/fastapi-users/

https://frankie567.github.io/fastapi-users/usage/

https://frankie567.github.io/fastapi-users/introduction/

fastapi-usersのインストールと設定

fastapi-usersを使用するためには、まずパッケージをインストールする必要があります。以下のコマンドを使用してインストールできます。

pip install fastapi-users

次に、fastapi-usersを設定します。これには、ユーザーモデルの作成、認証バックエンドの設定、データベースアダプターの設定などが含まれます。

以下に、基本的な設定の例を示します。

from fastapi import FastAPI
from fastapi_users import FastAPIUsers, models
from fastapi_users.authentication import JWTAuthentication
from fastapi_users.db import SQLAlchemyUserDatabase

DATABASE_URL = "sqlite:///./test.db"
SECRET = "SECRET"

class User(models.BaseUser):
    pass

class UserCreate(models.BaseUserCreate):
    pass

class UserUpdate(models.BaseUserUpdate):
    pass

class UserDB(User, models.BaseUserDB):
    pass

app = FastAPI()

jwt_authentication = JWTAuthentication(secret=SECRET, lifetime_seconds=3600)

fastapi_users = FastAPIUsers(
    user_db,
    [jwt_authentication],
    User,
    UserCreate,
    UserUpdate,
    UserDB,
)

この設定では、JWTを使用した認証を設定し、SQLiteデータベースを使用しています。ユーザーモデルは最小限の設定で、必要に応じて拡張できます。

以上が、fastapi-usersの基本的なインストールと設定の手順です。次のセクションでは、ユーザー登録と認証のルートの追加について説明します。

ユーザー登録と認証のルートの追加

FastAPIとfastapi-usersを使用して、ユーザー登録と認証のルートを追加することができます。以下にその手順を示します。

まず、ユーザー登録のルートを追加します。これは、新しいユーザーがアプリケーションに登録できるようにするためのものです。

@app.post("/register", response_model=UserDB)
async def register_user(user: UserCreate, user_db: SQLAlchemyUserDatabase = Depends(get_user_db)):
    return await user_db.create(user)

次に、ユーザー認証のルートを追加します。これは、登録済みのユーザーがアプリケーションにログインできるようにするためのものです。

@app.post("/auth/jwt/login")
async def login(response: Response, credentials: HTTPBasicCredentials = Depends(security)):
    user = await fastapi_users.get_user(credentials.username)
    if not user or not fastapi_users.verify_password(credentials.password, user.hashed_password):
        raise HTTPException(status_code=400, detail="Invalid login")

    return await jwt_authentication.get_login_response(user, response)

以上が、FastAPIとfastapi-usersを使用してユーザー登録と認証のルートを追加する基本的な手順です。これらのルートは、ユーザーがアプリケーションに登録し、ログインするための基本的な機能を提供します。次のセクションでは、データベースとの接続について説明します。

データベースとの接続

FastAPIとfastapi-usersを使用すると、データベースとの接続も簡単に行うことができます。以下にその手順を示します。

まず、データベースとの接続を管理するためのデータベースアダプターを設定します。この例では、SQLAlchemyを使用してSQLiteデータベースと接続します。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

次に、データベースセッションを管理するための依存関係を作成します。

from fastapi import Depends

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

最後に、この依存関係を使用してデータベースアダプターを作成します。

from fastapi_users.db import SQLAlchemyUserDatabase

user_db = SQLAlchemyUserDatabase(UserDB, SessionLocal)

以上が、FastAPIとfastapi-usersを使用してデータベースとの接続を行う基本的な手順です。これにより、ユーザー情報の永続化と管理が可能になります。次のセクションでは、ユーザーモデルの拡張について説明します。

ユーザーモデルの拡張

FastAPIとfastapi-usersを使用すると、ユーザーモデルを簡単に拡張することができます。以下にその手順を示します。

まず、ユーザーモデルを定義します。この例では、ユーザー名と年齢を追加します。

from pydantic import BaseModel

class User(models.BaseUser, BaseModel):
    username: str
    age: int

次に、ユーザー作成モデルを定義します。これは、新しいユーザーがアプリケーションに登録する際に使用されます。

class UserCreate(models.BaseUserCreate, BaseModel):
    username: str
    age: int

最後に、ユーザー更新モデルを定義します。これは、登録済みのユーザーが自分の情報を更新する際に使用されます。

class UserUpdate(User, models.BaseUserUpdate, BaseModel):
    pass

以上が、FastAPIとfastapi-usersを使用してユーザーモデルを拡張する基本的な手順です。これにより、アプリケーションの要件に合わせてユーザーモデルをカスタマイズすることが可能になります。次のセクションでは、パスワードの検証とハッシュ化について説明します。

パスワードの検証とハッシュ化

FastAPIとfastapi-usersを使用すると、パスワードの検証とハッシュ化も簡単に行うことができます。以下にその手順を示します。

まず、パスワードのハッシュ化を行います。これは、パスワードを平文で保存するのではなく、ハッシュ化した形で保存するためのものです。ハッシュ化には、get_password_hash関数を使用します。

hashed_password = fastapi_users.get_password_hash("yourpassword")

次に、パスワードの検証を行います。これは、ユーザーがログインする際に入力したパスワードが正しいかどうかを確認するためのものです。検証には、verify_password関数を使用します。

is_valid = fastapi_users.verify_password("yourpassword", hashed_password)

以上が、FastAPIとfastapi-usersを使用してパスワードの検証とハッシュ化を行う基本的な手順です。これにより、パスワードの安全な管理が可能になります。次のセクションでは、テストとデバッグについて説明します。

テストとデバッグ

FastAPIとfastapi-usersを使用すると、テストとデバッグも簡単に行うことができます。以下にその手順を示します。

まず、テストクライアントを作成します。これは、アプリケーションの各エンドポイントをテストするためのものです。

from fastapi.testclient import TestClient

client = TestClient(app)

次に、ユーザー登録のテストを行います。これは、新しいユーザーが正しく登録できるかを確認するためのものです。

def test_create_user():
    response = client.post("/register", json={"email": "[email protected]", "password": "password"})
    assert response.status_code == 200
    assert response.json()["email"] == "[email protected]"

最後に、ユーザー認証のテストを行います。これは、登録済みのユーザーが正しく認証できるかを確認するためのものです。

def test_authenticate_user():
    response = client.post("/auth/jwt/login", auth=("[email protected]", "password"))
    assert response.status_code == 200
    assert "access_token" in response.json()

以上が、FastAPIとfastapi-usersを使用してテストとデバッグを行う基本的な手順です。これにより、アプリケーションの各機能が正しく動作していることを確認することが可能になります。次のセクションでは、まとめと次のステップについて説明します。

まとめと次のステップ

この記事では、FastAPIとfastapi-usersを使用してユーザー管理機能を持つWebアプリケーションを構築する方法について説明しました。具体的には、以下の手順を説明しました。

  1. FastAPIとfastapi-usersの概要
  2. fastapi-usersのインストールと設定
  3. ユーザー登録と認証のルートの追加
  4. データベースとの接続
  5. ユーザーモデルの拡張
  6. パスワードの検証とハッシュ化
  7. テストとデバッグ

これらの手順を通じて、ユーザー管理機能を持つ高性能なWebアプリケーションを効率的に構築することが可能になりました。

次のステップとしては、以下のような拡張が考えられます。

  • ユーザーモデルのさらなる拡張:ユーザーモデルに更なる情報を追加することで、より詳細なユーザープロファイルを管理することが可能になります。
  • ソーシャルログインの実装:GoogleやFacebookなどのソーシャルログインを実装することで、ユーザーのログイン体験を向上させることができます。
  • ユーザーロールと権限の管理:ユーザーロールと権限を管理することで、アプリケーションのセキュリティを強化することができます。

以上が、FastAPIとfastapi-usersを使用したユーザー管理の実装についてのまとめと次のステップです。これらの知識を活用して、より高度なWebアプリケーションの開発に挑戦してみてください。それでは、Happy coding! 🚀

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です