複数フレームワーク間での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
- なぜTest-Driven Development(TDD)はビジネスに有利なのか
- Django × DigitalOcean × GitHub Actions × Docker で構築する継続的デリバリー(CD)環境
- LangChainとOllama、オープンソース埋め込みで作るローカル商品レコメンドシステム
- 2025年版:主要モバイルアプリフレームワーク徹底比較(Flutter、React Native、Expo、Ionic ほか)
- NumPy の `np.meshgrid()` を徹底解説:なぜ必要なのか?順序を入れ替えるとどうなるのか?
- PyMeasure を使って実験装置を自動制御する方法
- チャットボットを強化しよう:業務システムと連携するAPI開発サービス
- 今注目の「日本語対応Rasaチャットボットガイド」が話題の理由と、その活用方法
- 数学なしで「方程式」を推測する方法:猫と鳥の個体数の関係を探る
- AIに負けないプロジェクトの作り方:人とのつながりで価値を生むアイデア
- GNS3 + Wazuh + Dockerでサイバーセキュリティ演習ラボを構築しよう
- GNS3を使ってネットワーク機器の構成をシミュレーション&トレーニングする方法
- LMSとは?そしてなぜFrappe LMSに注目すべきか
- 工場における Agentic AI:スマートで自律的な次世代製造
- EVバイクをもっとスマートに、安全に管理する:ジオフェンシングとリアルタイム追跡システム
- FastAPI で Google OAuth を使った Single Sign-On (SSO) を実装する方法
- Simplicoで始めるタクシー配車アプリ開発:スケーラブル、安全、即スタート可能!
- 拡張性のあるEV充電ステーション管理システムのバックエンド設計 — Simplicoによる開発
- Odooで受注生産商品の複雑な価格設定をどう扱う?
- オーダーメイド商品を効率的に提供する「Made-to-Order」システムの作り方