Contents
Flask REST API 認証 JWT 実装例:Flask-JWT-ExtendedとLogtoによるRBAC連携
FlaskアプリケーションにおいてREST APIのセキュリティを強化する際、JWT認証は不可欠な技術です。特にFlask-JWT-Extendedという現代的なライブラリとの組み合わせにより、ロールベースアクセス制御(RBAC)も実現可能です。本記事では、2025年以降のセキュリティベストプラクティスに従い、認証フローの構築手順とLogto連携によるセキュアな設計法を具体的に解説します。
FlaskアプリケーションにおけるJWT認証導入の概要
現代のWeb API開発では、ユーザー認証・認可の信頼性がサービス品質に直結します。Flask-JWT-Extendedは2025年現在でも安定したメンテナンスが続くライブラリであり、Logtoとの連携でRBACを実装できる点が強みです。
たとえば、管理画面と一般ユーザーのアクセス権を分ける際、JWTトークンにロール情報を含めることで、アプリケーション内でのアクセス制御が可能になります。
重要:2025年以降、Flask-JWT(非推奨ライブラリ)はメンテナンス終了のため、Flask-JWT-Extendedを必ず使用してください。
Flask-JWT-Extendedのインストールと初期設定
JWT認証を導入するにはまずライブラリをインストールし、Flaskアプリケーションに統合します。
インストール手順
|
1 2 |
pip install Flask-JWT-Extended |
ベーシックな初期化コード
|
1 2 3 4 5 6 7 8 |
from flask import Flask, jsonify from flask_jwt_extended import JWTManager app = Flask(__name__) # 以下のSECRET_KEYは本番環境ではセキュアな値に置き換えること app.config['JWT_SECRET_KEY'] = 'super-secret-key' jwt = JWTManager(app) |
JWTトークン発行エンドポイントの作成
ユーザー認証を実装するには、/loginエンドポイントでトークンを発行します。以下が基本的なロジックです。
ユーザー認証ロジックの実装例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@app.route('/login', methods=['POST']) def login(): username = request.json.get('username') password = request.json.get('password') # ここにDBやOAuthでの認証処理を記述(省略) if not username or not password: return jsonify({"msg": "Missing username or password"}), 401 # 認証成功時のみトークン発行 access_token = create_access_token(identity=username) return jsonify(access_token=access_token), 200 |
アクセストークン生成のコードサンプル
|
1 2 3 4 5 |
from flask_jwt_extended import create_access_token # 認証に成功したユーザーIDをidentityパラメータとして渡す access_token = create_access_token(identity=username) |
注意点:本番環境では
JWT_SECRET_KEYは安全なランダム値を使用し、暗号化アルゴリズムもAES-256など強力なものを選択してください。
認証デコレータによるアクセス制御
@jwt_required()などのデコレータでエンドポイントを保護します。複数のロールを指定する場合もあります。
@jwt_required()の基本的な使い方
|
1 2 3 4 5 |
@app.route('/protected', methods=['GET']) @jwt_required() def protected(): return jsonify(message="認証済みユーザーのみアクセス可能です"), 200 |
複数ロールベースの制限例
|
1 2 3 4 5 6 7 8 9 10 |
from flask_jwt_extended import jwt_required, get_jwt_claims @app.route('/admin', methods=['GET']) @jwt_required() def admin(): claims = get_jwt_claims() if not claims.get('is_admin'): return jsonify(message="管理者権限が必要です"), 403 return jsonify(message="管理者専用コンテンツ"), 200 |
Logtoとの連携によるRBAC実現
LogtoはOAuth2.0とOpenID Connectをサポートし、トークン内にロール情報を含めることができます。これによりFlask-JWT-Extendedで制御が可能になります。
Logto認証サーバーとの接続設定
- Logtoのプロジェクトを作成し、Client IDとClient Secretを取得します。
- Flaskアプリケーション内でLogtoの認証エンドポイントにリクエストを送信します(例:
/api/auth/token)。
ロールベースのアクセス制限コード例
|
1 2 3 4 5 6 7 8 9 10 11 |
# Logtoから受け取ったトークン情報をJWT形式で解析 decoded_token = jwt.decode(token, options={"verify_signature": False}) role = decoded_token.get('roles', []) @app.route('/role-restricted', methods=['GET']) @jwt_required() def role_restricted(): if 'admin' not in role: return jsonify(message="管理者ロールが必要です"), 403 return jsonify(message="ロール制限解除済み"), 200 |
セキュリティベストプラクティスの実装
JWTトークンを扱う際には、セキュリティ設定が非常に重要です。特に有効期限や刷新トークン機能の導入が推奨されます。
有効期限設定の最適値
| 項目 | 値 | 補足 |
|---|---|---|
| アクセストークン | 30分 | 短い期間で刷新トークンと併用 |
| リフレッシュトークン | 7日 | リモートから安全に刷新可能 |
リフレッシュトークンの管理方法
|
1 2 3 4 5 6 7 8 9 |
from flask_jwt_extended import create_refresh_token, set_access_cookies @app.route('/refresh', methods=['POST']) @jwt_required(refresh=True) def refresh(): access_token = create_access_token(identity=get_jwt_identity()) # クッキーにリフレッシュトークンを保存(セキュアな設定が必要) return jsonify(access_token=access_token), 200 |
Flask-JWT-Extendedと競合技術の比較
Flask-JWT-ExtendedはRBACを実装する上で強力ですが、他のライブラリも選択肢として存在します。以下に主なライブラリの比較を行います。
Flask-OAuthlibとの比較
| 項目 | Flask-JWT-Extended | Flask-OAuthlib |
|---|---|---|
| サポート技術 | JWT, RBAC | OAuth2.0 |
| セキュリティ設定 | 簡単な構成 | 複雑なカスタマイズ |
| 学習曲線 | 低め | 高め |
| RBACサポート | バッテリー込み | 不要(OAuth2.0ではロール管理はアプリ側に依存) |
選択のポイント:Flask-JWT-ExtendedはRBACを実装する上で手軽で、JWTトークンの操作がシンプルです。一方でOAuth2.0を必要とするユースケースや企業認証を求める場合、Flask-OAuthlibが適しています。
まとめ
- Flask-JWT-Extendedは現代のFlaskアプリケーションでJWT認証を実装するための信頼できるライブラリです。
- Logtoと連携することでRBACを簡単に実装可能です。
- セキュリティ設定として、有効期限や刷新トークンの導入が必須です。
具体的なコード例と導入手順を通じて、Flask REST APIの認証構築について理解を深め、自社サービスに即した実装を行ってください。
本記事の内容に基づき、サンプルコードを基に本番環境でのJWT認証構築を試してみましょう。
補足情報
- 2026年以降のベストプラクティスについては、現時点では明確なガイドラインがありません。ただし、セキュリティ設定やトークン管理に関しては常に最新の情報を確認してください。
- Logtoとの連携時に
verify_signature=Falseを無条件に使用するべきではありません。信頼できる認証サーバーからのトークンであれば、署名検証を有効にしてください。