Flask-JWT-Extended 使用教程
项目介绍
Flask-JWT-Extended 是一个开源的 Flask 扩展,提供了 JSON Web Token (JWT) 支持,包括多种功能和工具。这个项目不仅支持基本的 JWT 认证,还提供了诸如刷新令牌、范围和角色、JWT 的 CSRF 保护等高级功能。
项目快速启动
安装
首先,你需要通过 pip 安装 Flask-JWT-Extended:
pip install flask-jwt-extended
基本配置
以下是一个基本的 Flask 应用示例,展示了如何配置和使用 Flask-JWT-Extended:
from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, create_access_token
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret' # 更改此密钥
jwt = JWTManager(app)
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if username != 'test' or password != 'test':
return jsonify({"msg": "Bad username or password"}), 401
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token)
if __name__ == '__main__':
app.run()
应用案例和最佳实践
刷新令牌
Flask-JWT-Extended 支持刷新令牌,这可以用来生成新的访问令牌而不需要用户重新认证。以下是如何实现刷新令牌的示例:
from flask_jwt_extended import create_refresh_token
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if username != 'test' or password != 'test':
return jsonify({"msg": "Bad username or password"}), 401
access_token = create_access_token(identity=username)
refresh_token = create_refresh_token(identity=username)
return jsonify(access_token=access_token, refresh_token=refresh_token)
保护路由
你可以使用装饰器来保护特定的路由,确保只有认证用户可以访问:
from flask_jwt_extended import jwt_required
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
return jsonify({"msg": "This is a protected route"})
典型生态项目
Flask-JWT-Extended 通常与其他 Flask 扩展一起使用,以构建完整的后端服务。例如,它可以与 Flask-SQLAlchemy 结合使用来管理用户数据,或者与 Flask-RESTful 结合使用来构建 REST API。
结合 Flask-SQLAlchemy
以下是一个简单的示例,展示了如何将 Flask-JWT-Extended 与 Flask-SQLAlchemy 结合使用:
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(120), nullable=False)
@app.route('/register', methods=['POST'])
def register():
username = request.json.get('username', None)
password = request.json.get('password', None)
new_user = User(username=username, password=password)
db.session.add(new_user)
db.session.commit()
return jsonify({"msg": "User created successfully"}), 201
通过这些模块的介绍和示例,你应该能够快速上手并有效地使用 Flask-JWT-Extended 来增强你的 Flask 应用的安全性。