Contents
FlaskとJWT認証の実装チュートリアル
FlaskアプリケーションにJWT認証を導入するには、その仕組みと実装手順を理解することが重要です。JWT(JSON Web Token)は、ユーザー情報を暗号化してクライアントに送信し、サーバー側で検証することで認証を行う技術です。この方法はAPIのセキュリティ強化やユーザー認証フローの簡素化に有効で、特にFlaskでのJWT実装チュートリアルとして多くのエンジニアが求めています。
以下の手順とコード例を参考に、具体的な導入手順を解説します。初心者向けにわかりやすく構成し、安全な実装法も紹介します。
PyJWTとFlaskの環境構築手順
FlaskアプリケーションにJWTを導入するには、PyJWTライブラリが必要です。まず仮想環境を作成し、必要なパッケージをインストールします。
-
仮想環境の作成と有効化
bash
python -m venv venv
source venv/bin/activate # Windowsの場合: venv\Scripts\activate -
ライブラリのインストール
bash
pip install Flask pyjwt -
プロジェクト構成例
次のような基本的なディレクトリ構造を用意します。
flask_jwt_project/
├── app.py
└── requirements.txt
この環境で、トークン発行と検証のコードを実装していきます。
トークン発行エンドポイントの実装
ユーザーが認証された際にJWTを発行するためのエンドポイントを作成します。以下は/loginエンドポイントの例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from flask import Flask, request, jsonify import jwt import datetime app = Flask(__name__) SECRET_KEY = "your-secret-key" # 実際には環境変数で管理することを推奨(非推奨: ハードコーディング) @app.route("/login", methods=["POST"]) def login(): username = request.json.get("username") password = request.json.get("password") # ユーザー認証ロジック(簡易版) if username == "user" and password == "pass": payload = { "username": username, "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1) } token = jwt.encode(payload, SECRET_KEY, algorithm="HS256") return jsonify({"token": token}), 200 return jsonify({"error": "Invalid credentials"}), 401 |
このコードでは、ユーザー名とパスワードをPOSTリクエストで受け取り、認証成功時に有効期限付きのトークンを発行します。HS256アルゴリズムを使用しており、簡易な実装が可能です。
JWT検証ミドルウェアの作成方法
発行されたトークンが有効かどうかをチェックするためのミドルウェアを作成します。以下はカスタムデコレーター@jwt_required()の例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def jwt_required(func): def wrapper(*args, **kwargs): token = request.headers.get("Authorization") if not token: return jsonify({"error": "Missing token"}), 401 try: payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"]) # ペイロードに必要な情報を取得 username = payload.get("username") if not username: return jsonify({"error": "Invalid token"}), 401 except jwt.ExpiredSignatureError: return jsonify({"error": "Token expired"}), 401 except jwt.InvalidTokenError: return jsonify({"error": "Invalid token"}), 401 return func(*args, **kwargs) return wrapper @app.route("/protected", methods=["GET"]) @jwt_required def protected(): return jsonify({"message": "Access granted!"}), 200 |
このデコレーターは、リクエストヘッダーからトークンを取得し、pyjwt.decode()で検証します。失敗時には適切なエラーレスポンスを返却する仕組みです。
セキュリティベストプラクティス
JWTを安全に使用するためには、以下のようなポイントを意識してください。
秘密鍵の管理方法とアルゴリズム選定の重要性
セキュリティ強化のため、秘密鍵やアルゴリズムの選択が不可欠です。以下に具体的なベストプラクティスを整理しました。
|
1 2 3 4 5 |
| 項目 | 値 | 補足 | |------|----|------| | **HS256** | 簡易で高速 | シングルサーバー向け。秘密鍵は共通 | | **RS256** | 業務用に推奨 | 公開鍵/秘密鍵ペアを使用。分散環境に向く | |
blockquote: トークンの有効期限は、セキュリティ強化のため1時間以内に設定することがベストプラクティスです。
秘密鍵管理方法
- 環境変数で
SECRET_KEYを保存し、ソースコードに直接記載しない - マルチエンバイロメント(開発/本番)ごとに異なる秘密鍵を使用
認証フローの全体像と今後の拡張性
ユーザー認証フローは以下の手順で構成されます。
- ユーザー登録:データベースにユーザー情報を保存
- ログイン:IDとパスワードを入力し、
/loginからトークン取得 - API利用:トークンをヘッダーに含めて認証済みエンドポイントへアクセス
このフローは刷新トークン(Refresh Token)の導入でさらに拡張可能です。刷新トークンは、短期間有効なアクセストークンを定期的に更新するための仕組みです。
まとめ
- FlaskアプリケーションにJWT認証を導入するには、PyJWTライブラリを使用
- トークン発行エンドポイントと検証ミドルウェアを作成することで、セキュアな認証フローが構築可能
- 実際の開発では、秘密鍵管理やアルゴリズム選定に注意し、HTTPSでの通信を必須とする
- 今後の拡張として刷新トークンやロールベースアクセス制御(RBAC)の導入も検討
本記事を参考に早速FlaskプロジェクトにJWT認証を導入してみましょう。