
前の記事では、FastAPIを使用して基本的な個人ブログを構築し、正常にデプロイしました。
しかし、このブログには深刻なセキュリティ上の問題があります。誰でも自由に記事を作成できてしまいます。
次のチュートリアルでは、このブログにユーザーおよび認証システムを追加して、より安全にしていきます。
早速始めましょう。
認証方法の紹介
Web開発において、最も一般的な認証方法は トークンベース(例:JWT) と セッションベース(Cookie) の2つです。
- JWT(JSON Web Tokens): 現在最も人気のある認証方法です。ユーザーがログインすると、サーバーはトークンを生成し、クライアントに返します。クライアントは後続のリクエストにこのトークンを含め、サーバーはトークンを検証するだけでユーザーの身元を確認できます。サーバーはユーザーの状態を保存する必要がないため、この方法は分散型で水平スケーラブルな大規模アプリケーションに非常に適しています。
- セッション-Cookie: ユーザーがログインすると、サーバーはセッションを作成し、Cookieを介してセッションIDをブラウザに返します。ブラウザは後続のリクエストにこのCookieを自動的に含めます。サーバーはセッションIDに基づいて対応するセッション情報を検索することで、ユーザーを識別します。
このチュートリアルでは、従来のセッション-Cookie方式を選択します。ブログはシンプルなアーキテクチャのモノリスであるため、認証にセッション-Cookiesを使用するのが最も直接的で古典的、かつ十分に安全なアプローチです。
ステップ1:ユーザーモジュールの作成
認証を処理できるようになる前に、まずユーザーシステムが必要です。
1. ユーザーデータモデルの作成
models.py
ファイルを開き、Post
クラスの上に User
モデルを追加します。
最初の記事で main.py
に create_db_and_tables
関数を実装したため、アプリケーション起動時にすべてのSQLModel
モデルが自動的に検出され、対応するデータベーステーブルが作成されます。そのため、SQLステートメントを手動で実行する必要はありません。
手動でSQLを実行する必要があり、データベースがLeapcellで作成された場合、
グラフィカルインターフェイスを使用してSQLステートメントを簡単に実行できます。ウェブサイトのデータベース管理ページにアクセスし、上記のステートメントをSQLインターフェイスに貼り付けて実行するだけです。

2. パスワード暗号化ライブラリのインストール
セキュリティのため、ユーザーのパスワードをデータベースに平文で保存することは絶対に避けるべきです。パスワードのハッシュ化には bcrypt
ライブラリを使用します。
まず、requirements.txt
ファイルに bcrypt
を追加します。
次に、インストールコマンドを実行します。
ステップ2:ユーザー登録および検証ロジックの実装
次に、ユーザーデータを処理し、パスワードを検証する関数を作成します。
プロジェクトのルートディレクトリに users_service.py
という新しいファイルを作成し、ユーザー関連のビジネスロジックを格納します。
次に、ユーザー認証を処理するために auth_service.py
ファイルを作成します。
ステップ3:ログインおよび登録ページの作成
ユーザーが登録およびログインするためのインターフェースを提供する必要があります。templates
フォルダ内に login.html
と register.html
ファイルを作成します。
-
register.html
-
login.html
同時に、ヘッダーの右上隅に登録とログインへのリンクを追加するために _header.html
を更新しましょう。
ステップ4:ルーティングとコントローラーロジックの実装
プロジェクト構造を明確にするために、ルーティングロジックを異なるファイルに分割します。
-
プロジェクトのルートディレクトリに
routers
フォルダを作成します。 -
main.py
からPost
関連のすべてのルート(@app.get("/posts", ...)
など)をカットし、routers/posts.py
ファイルに貼り付けます。注意:
@app
デコレータを@router
に置き換えています。 -
routers
フォルダ内に、ユーザー登録を処理するusers.py
を作成します。 -
routers
フォルダ内に、ユーザーログインを処理するauth.py
を作成します。 -
最後に、
main.py
を更新して古いルートを削除し、新しいルーターファイルを含めます。
ステップ5:テスト
これで、基本的なユーザー登録とログイン検証ロジックが完成しました。
プロジェクトを再起動します。
http://localhost:3000/users/register
にアクセスして登録します。

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

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

しかし、現在のログインは単なる一回限りの検証プロセスであり、サーバーはユーザーのログイン状態を「覚えて」いません。ブラウザを閉じたり、他のページにアクセスしたりすると、未認証の状態になります。
次の記事では、セッション管理を導入して真のユーザーログイン状態の永続化を実現し、ユーザー権限に基づいてページアクセスや操作を制限します。
Xでフォローする:@LeapcellJP
関連記事: