複数フレームワーク間でのJWT認証の管理

Flaskをフロントエンド、FastAPIをバックエンドAPIとして使用するような複数フレームワークでアプリケーションを開発する際、認証を安全かつスムーズに管理するのは難しい場合があります。JSON Web Token(JWT)は、これらのフレームワーク間で統一された認証の仕組みを実現する強力な方法です。本記事では、その具体的な方法を紹介します。

🔑 JWTとは?

JWT(JSON Web Token)は、安全かつ簡潔な方法で情報をエンコードしてやり取りできるトークンです。構造は以下の3つのパートで構成されます:

  • Header:トークンのタイプと署名アルゴリズムを指定
  • Payload:ユーザー情報や有効期限などのクレームを含む
  • Signature:データの改ざんを防ぐ署名

🚀 FastAPIでのJWT認証のセットアップ

依存パッケージのインストール

pip install fastapi python-jose passlib[bcrypt] uvicorn

JWTトークンの生成

from jose import jwt
from datetime import datetime, timedelta

SECRET_KEY = "supersecret"
ALGORITHM = "HS256"

def create_access_token(data: dict, expires_delta=None):
    to_encode = data.copy()
    expire = datetime.utcnow() + (expires_delta or timedelta(minutes=30))
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

🖥 FlaskでのJWT使用方法

Flaskのセットアップ

pip install flask PyJWT requests

JWTトークンの検証

import jwt
from flask import Flask, session, redirect, url_for, flash, request

app = Flask(__name__)
app.secret_key = "your_flask_secret"
JWT_SECRET_KEY = "supersecret"
JWT_ALGORITHM = "HS256"

def is_token_valid(token):
    try:
        jwt.decode(token, JWT_SECRET_KEY, algorithms=[JWT_ALGORITHM])
        return True
    except jwt.ExpiredSignatureError:
        return False
    except jwt.InvalidTokenError:
        return False

@app.before_request
def validate_jwt():
    if request.endpoint == 'login':
        return
    token = session.get("jwt_token")
    if not token or not is_token_valid(token):
        flash("セッションの有効期限が切れているか無効です。再度ログインしてください。")
        return redirect(url_for("login"))

🔄 フレームワーク間のJWTフロー

  1. ユーザーがFlask経由でログイン
  2. FlaskがFastAPIにJWTトークンを要求
  3. FastAPIがトークンを発行
  4. Flaskがトークンをセッションに保存
  5. Flaskがそのトークンを用いて各リクエストを検証

🌐 デプロイ構成図

graph TD;
    Browser-->Flask(Flask Frontend);
    Flask-->FastAPI(FastAPI Backend);
    FastAPI-->MongoDB;
    FastAPI-->JWT("JWT Token");
    JWT-->Flask;
    Flask-->Browser;

📦 Docker Composeによる環境設定

各サービスで共通のJWTシークレットを使う設定:

services:
  fastapi:
    environment:
      SECRET_KEY: ${SECRET_KEY}

  flask:
    environment:
      SECRET_KEY: ${SECRET_KEY}

.envファイルの例:

SECRET_KEY=supersecret

🚨 よくある問題と対策

  • トークンの有効期限切れ:期限切れの際に再ログインを促す
  • シークレットキーの不一致:全サービスで同一のキーを使用
  • 依存関係の不整合:例えば、bcryptやpasslibのバージョン問題
pip install bcrypt==4.0.1 passlib>=1.7.5

🛡 セキュリティに関する注意点

  • シークレットキーは安全に管理する
  • HTTPSを常に使用する
  • 有効期限付きのトークンとリフレッシュ機構を実装する

💡 ベストプラクティスまとめ

  • 共通のシークレットキーを使う
  • 各リクエストでトークンを検証する
  • トークンエラー発生時にユーザーにわかりやすく通知する

📚 参考リンク

🧑‍💻 まとめ

FlaskとFastAPIのような複数フレームワークでJWT認証を統一することで、セキュリティを確保しつつ、保守性や拡張性も高めることができます。この記事で紹介した手順とベストプラクティスをもとに、安全でスケーラブルな認証システムを構築してください。



Get in Touch with us

Chat with Us on LINE

iiitum1984

Speak to Us or Whatsapp

(+66) 83001 0222

Related Posts

Our Products