複数フレームワーク間での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
- TAKシステムが洪水災害対応を変革する
- 写真から商品をおすすめ:AIで実現するスマートショッピング
- 高度なシミュレーションプログラムでアンテナ結合の課題に取り組む
- 未来の働き方:オープンソースが切り拓く労働省力化オートメーション
- 次なるフロンティア:富裕層のためのデジタル・プライベートクラブ
- コードで「よりよく考える」:数学的ショートカットで大規模ソフトウェアを理解する
- 今日のMacrohardをつくる:企業向けAIエージェント・プラットフォーム
- Aider × IDE連携で Vue.js 開発を一気にスマートに!
- ねぇ開発者さん!Codex CLI や Aider で AIにコーディング手伝ってもらおうぜ
- 正しい方法でAIと共にコーディングする
- 最適なLLMモデルの選び方: Instruct・MLX・8-bit・Embedding
- ローカル LLM モデルを日常業務で活用する方法
- EmbeddingモデルとLLMを組み合わせて、より賢いAIアプリを作る方法
- 連続素材欠陥検出用スマートビジョンシステム
- ラインスキャン + AI で作るリアルタイム欠陥検出システム(汎用設計ガイド)
- ソースコードを読む方法:Frappe Framework を例に
- Interface-Oriented Design:クリーンアーキテクチャの基礎
- アンチドローンシステムのすべて ─ アーキテクチャ・ハードウェア・ソフトウェア徹底解説
- ドローンにおけるRTOS vs Linux:最新設計・セキュリティ・Rust活用法
- なぜSpringはアノテーションだらけ? JavaとPython Web開発の本質的な違い