如何将token_required装饰器中的Token传递至各受保护路由的请求头?
将Token从装饰器传递到受保护路由的请求头
要把token_required装饰器中获取的Token传递到受保护路由的请求头里,只需在装饰器验证Token有效后,将其注入到Flask的request对象headers中即可。以下是修改后的完整代码及说明:
1. 登录端点(保持不变)
@app.route("/login") def login(): auth = request.authorization if auth and auth.password == "password": token = jwt.encode( { "user": auth.username, "exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=30), }, app.config["SECRET_KEY"], ) return jsonify({"token": token}) return make_response( "Couldn't verify!", 401, {"WWW-Authenticate": 'Basic realm="Login Required"'} )
2. 修改后的token_required装饰器
核心修改是在Token验证通过后,将其添加到请求头中:
from functools import wraps from flask import request, jsonify import jwt def token_required(f): @wraps(f) def decorated(*args, **kwargs): token = request.args.get("token") if not token: return jsonify({"message": "Token is missing"}), 403 try: # 修复安全问题:开启JWT签名验证并指定算法 data = jwt.decode( token, app.config["SECRET_KEY"], algorithms=["HS256"] ) except jwt.ExpiredSignatureError: return jsonify({"message": "Token has expired"}), 403 except jwt.InvalidTokenError: return jsonify({"message": "Token is invalid"}), 403 # 将Token注入请求头,自定义字段名可按需调整 request.headers['X-Token'] = token return f(*args, **kwargs) return decorated
3. 受保护端点(读取请求头中的Token)
在受保护路由里,可以直接从请求头获取传递过来的Token:
@app.route("/protected") @token_required def protected(): # 从请求头提取Token received_token = request.headers.get('X-Token') return f"Only authorized users can access this. Token received: {received_token}"
关键注意事项
- 原代码关闭了JWT签名验证(
verify_signature: False),这会导致任意伪造的Token都能通过验证,存在严重安全风险,必须改为指定算法并开启验证。 - 注入请求头的字段名可以自定义,比如如果要遵循Bearer认证规范,可以设置
request.headers['Authorization'] = f"Bearer {token}"。 - 所有被
@token_required装饰的路由,都能在request.headers中拿到这个Token,无需额外传递参数。
内容的提问来源于stack exchange,提问作者Amit Sumit
相关产品推荐
相关产品推荐

