複数フレームワーク間での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
- AIが実現する病院システムの垂直統合(Vertical Integration)
- Industrial AIにおけるAIアクセラレータ なぜ「チップ」よりもソフトウェアフレームワークが重要なのか
- 日本企業向け|EC・ERP連携に強いAI×ワークフロー型システム開発
- 信頼性の低い「スマート」システムが生む見えないコスト
- GPU vs LPU vs TPU:AIアクセラレータの正しい選び方
- LPUとは何か?日本企業向け実践的な解説と活用事例
- ソフトウェアエンジニアのためのサイバーセキュリティ用語マッピング
- モダンなサイバーセキュリティ監視・インシデント対応システムの設計 Wazuh・SOAR・脅威インテリジェンスを用いた実践的アーキテクチャ
- AI時代におけるクラシック・プログラミングの考え方
- SimpliPOSFlex 現場の「現実」に向き合うためのPOS(日本市場向け)
- 古典的プログラミング思考 ― Kernighan & Pike から学び続けること
- コードを書く前に:私たちが必ずお客様にお聞きする5つの質問
- なぜ利益を生むシステムでも「本当の価値」を持たないことがあるのか
- 彼女の世界(Her World)
- Temporal × ローカルLLM × Robot Framework 日本企業向け「止まらない・壊れない」業務自動化アーキテクチャ
- RPA × AI: なぜ「自動化」は知能なしでは破綻し、 知能は制御なしでは信頼されないのか
- 国境紛争・代理戦争をどうシミュレーションするか
- 検索とアクセスを最初に改善する 大学図書館の戦略的価値を最短で回復する方法
- 工場とリサイクル事業者をつなぐ、新しいスクラップ取引プラットフォームを開発しています
- Python で MES(製造実行システム)を開発する方法 ― 日本の製造現場に適した実践ガイド ―













