Flask-JWT-Extended
是一个 Flask 扩展,用于处理 JSON Web Tokens (JWT)。JWT 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。Flask-JWT-Extended
提供了 JWT 的生成、验证和管理功能。
Flask-JWT-Extended
支持以下几种类型的 JWT:
Flask-JWT-Extended
适用于需要身份验证和授权的 Web 应用,例如:
Flask-JWT-Extended
默认情况下不会检查请求头中的 X-CSRF-TOKEN
。这是因为 JWT 本身已经包含了签名,可以防止篡改。CSRF(跨站请求伪造)攻击通常针对的是传统的基于会话的身份验证机制,而 JWT 的无状态特性使得 CSRF 攻击的难度大大增加。
如果你仍然希望检查 X-CSRF-TOKEN
,可以手动实现 CSRF 保护。以下是一个示例代码:
from flask import Flask, request, jsonify
from flask_jwt_extended import JWTManager, jwt_required, create_access_token, get_jwt_identity
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret' # 替换为你的密钥
jwt = JWTManager(app)
# 模拟一个 CSRF 令牌存储
csrf_tokens = {}
@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)
csrf_token = generate_csrf_token()
csrf_tokens[username] = csrf_token
return jsonify(access_token=access_token, csrf_token=csrf_token), 200
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
current_user = get_jwt_identity()
if request.headers.get('X-CSRF-TOKEN') != csrf_tokens.get(current_user):
return jsonify({"msg": "CSRF token mismatch"}), 403
return jsonify(logged_in_as=current_user), 200
def generate_csrf_token():
import secrets
return secrets.token_hex(16)
if __name__ == '__main__':
app.run()
通过上述方法,你可以在使用 Flask-JWT-Extended
的同时,手动实现 CSRF 保护。
领取专属 10元无门槛券
手把手带您无忧上云