複数フレームワーク間での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フロー
- ユーザーがFlask経由でログイン
- FlaskがFastAPIにJWTトークンを要求
- FastAPIがトークンを発行
- Flaskがトークンをセッションに保存
- 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
Related Posts
- Agentic AI × SOCワークフロー:プレイブックを超えた自律防御【2026年版ガイド】
- SOCをゼロから構築する:Wazuh + IRIS-web 現場レポート
- ECと基幹システムの二重入力をなくす:受注から仕訳までの自動化アーキテクチャ
- SIerのブラックボックスから脱却する:オープンソースで構築する中小企業向けSOCアーキテクチャ
- リサイクル工場管理システム:日本のリサイクル事業者が見えないところで損をしている理由
- エネルギー管理ソフトウェアのROI:電気代を15〜40%削減できる理由
- Wazuh + オープンソースで構築する軽量SOC:実践ガイド(2026年版)
- ECサイトとERPを正しく連携する方法:実践ガイド(2026年版)
- AI コーディングアシスタントが実際に使うツールとは?(Claude Code・Codex CLI・Aider)
- 燃費を本気で改善する:高負荷・低回転走行の物理学
- タイ産ドリアン・青果物デポ向け倉庫管理システム(WMS)— ERP連携・輸出書類自動化
- 現代のドリアン集荷場:手書き台帳をやめて、システムでビジネスを掌握する
- AI System Reverse Engineering:AIでレガシーソフトウェアシステムを理解する(Architecture・Code・Data)
- 人間の優位性:AIが代替できないソフトウェア開発サービス
- ゼロからOCPPへ:ホワイトラベルEV充電プラットフォームの構築
- Wazuh Decoders & Rules: 欠けていたメンタルモデル
- 製造現場向けリアルタイムOEE管理システムの構築
- 古い価格や在庫を表示しないECサイトのキャッシュ戦略
- AIによるレガシーシステム modernization:ERP・SCADA・オンプレミス環境へのAI/ML統合ガイド
- RAGアプリが本番環境で失敗する理由(そして解決策)













