You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:05:18