FastAPIで完璧なブログを構築する:ユーザーシステムを追加

要約
このチュートリアルでは、ユーザー認証システムを追加してFastAPIブログを保護する方法を説明します。ユーザーモデルの作成、パスワードのハッシュ化、登録およびログインルートとページの構築について説明します。
意見はこのエリアに表示されます
アイキャッチ画像

前の記事では、FastAPIを使用して基本的な個人ブログを構築し、正常にデプロイしました。

しかし、このブログには深刻なセキュリティ上の問題があります。誰でも自由に記事を作成できてしまいます。

次のチュートリアルでは、このブログにユーザーおよび認証システムを追加して、より安全にしていきます。

早速始めましょう。

認証方法の紹介

Web開発において、最も一般的な認証方法は トークンベース(例:JWT)セッションベース(Cookie) の2つです。

  • JWT(JSON Web Tokens): 現在最も人気のある認証方法です。ユーザーがログインすると、サーバーはトークンを生成し、クライアントに返します。クライアントは後続のリクエストにこのトークンを含め、サーバーはトークンを検証するだけでユーザーの身元を確認できます。サーバーはユーザーの状態を保存する必要がないため、この方法は分散型で水平スケーラブルな大規模アプリケーションに非常に適しています。
  • セッション-Cookie: ユーザーがログインすると、サーバーはセッションを作成し、Cookieを介してセッションIDをブラウザに返します。ブラウザは後続のリクエストにこのCookieを自動的に含めます。サーバーはセッションIDに基づいて対応するセッション情報を検索することで、ユーザーを識別します。

このチュートリアルでは、従来のセッション-Cookie方式を選択します。ブログはシンプルなアーキテクチャのモノリスであるため、認証にセッション-Cookiesを使用するのが最も直接的で古典的、かつ十分に安全なアプローチです。

ステップ1:ユーザーモジュールの作成

認証を処理できるようになる前に、まずユーザーシステムが必要です。

1. ユーザーデータモデルの作成

models.py ファイルを開き、Post クラスの上に User モデルを追加します。

最初の記事で main.pycreate_db_and_tables 関数を実装したため、アプリケーション起動時にすべてのSQLModelモデルが自動的に検出され、対応するデータベーステーブルが作成されます。そのため、SQLステートメントを手動で実行する必要はありません。

手動でSQLを実行する必要があり、データベースがLeapcellで作成された場合、

Leapcell

グラフィカルインターフェイスを使用してSQLステートメントを簡単に実行できます。ウェブサイトのデータベース管理ページにアクセスし、上記のステートメントをSQLインターフェイスに貼り付けて実行するだけです。

ImageP0

2. パスワード暗号化ライブラリのインストール

セキュリティのため、ユーザーのパスワードをデータベースに平文で保存することは絶対に避けるべきです。パスワードのハッシュ化には bcrypt ライブラリを使用します。

まず、requirements.txt ファイルに bcrypt を追加します。

次に、インストールコマンドを実行します。

ステップ2:ユーザー登録および検証ロジックの実装

次に、ユーザーデータを処理し、パスワードを検証する関数を作成します。

プロジェクトのルートディレクトリに users_service.py という新しいファイルを作成し、ユーザー関連のビジネスロジックを格納します。

次に、ユーザー認証を処理するために auth_service.py ファイルを作成します。

ステップ3:ログインおよび登録ページの作成

ユーザーが登録およびログインするためのインターフェースを提供する必要があります。templates フォルダ内に login.htmlregister.html ファイルを作成します。

  • register.html

  • login.html

同時に、ヘッダーの右上隅に登録とログインへのリンクを追加するために _header.html を更新しましょう。

ステップ4:ルーティングとコントローラーロジックの実装

プロジェクト構造を明確にするために、ルーティングロジックを異なるファイルに分割します。

  1. プロジェクトのルートディレクトリに routers フォルダを作成します。

  2. main.py から Post 関連のすべてのルート(@app.get("/posts", ...) など)をカットし、routers/posts.py ファイルに貼り付けます。

    注意:@app デコレータを @router に置き換えています。

  3. routers フォルダ内に、ユーザー登録を処理する users.py を作成します。

  4. routers フォルダ内に、ユーザーログインを処理する auth.py を作成します。

  5. 最後に、main.py を更新して古いルートを削除し、新しいルーターファイルを含めます。

ステップ5:テスト

これで、基本的なユーザー登録とログイン検証ロジックが完成しました。

プロジェクトを再起動します。

http://localhost:3000/users/register にアクセスして登録します。

ImageP1

登録が成功すると、自動的に http://localhost:3000/auth/login にリダイレクトされ、ログインします。

ImageP2

正しいアカウント情報と間違ったアカウント情報を入力して結果をテストできます。たとえば、間違った情報を入力すると、401 Unauthorizedエラーが表示されます。

ImageP3

しかし、現在のログインは単なる一回限りの検証プロセスであり、サーバーはユーザーのログイン状態を「覚えて」いません。ブラウザを閉じたり、他のページにアクセスしたりすると、未認証の状態になります。

次の記事では、セッション管理を導入して真のユーザーログイン状態の永続化を実現し、ユーザー権限に基づいてページアクセスや操作を制限します。


Xでフォローする:@LeapcellJP


ブログでこの記事を読む

関連記事:

Explore More
関連記事はありません。