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

Flask应用JWT认证跳转报Missing Authorization Header如何解决?

问题根源

你遇到的「Missing Authorization Header」报错,核心原因有两个:

  1. @jwt_required() 装饰器默认仅从请求头的Authorization字段读取JWT,但你在重定向时给响应头加的Authorization,浏览器不会自动携带到后续的重定向请求里——浏览器重定向只会自动传递Cookie这类符合规范的凭证,不会保留自定义响应头。
  2. 通过URL参数传递token是不安全的(会被记录到日志、浏览器历史、Referer头中),且和flask-jwt-extended的默认认证逻辑不匹配。
解决方案:改用Cookie存储JWT(最佳实践)

Flask-JWT-Extended支持将JWT存入Cookie,浏览器会自动在同域请求中携带Cookie,完美解决重定向后的认证问题。

1. 配置JWT从Cookie读取token

在初始化JWTManager后,添加加载器函数指定从Cookie获取token:

@jwt.token_in_cookie_loader
def get_token_from_cookie(request):
    return request.cookies.get('access_token_cookie')

2. 修改登录视图,将JWT存入Cookie

去掉URL传token的逻辑,登录成功后把token写入HttpOnly、Secure的Cookie(HttpOnly防止XSS窃取,Secure仅在HTTPS下传输):

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')

        if not username or not password:
            return jsonify({"msg": "Missing username or password"}), 400

        if authenticate(username, password):
            access_token = create_access_token(identity={'username': username})
            # 重定向到forms页面,无需传token参数
            response = redirect(url_for('forms', username=username))
            # 将token存入Cookie,设置HttpOnly和Secure(生产环境建议开启Secure)
            response.set_cookie(
                'access_token_cookie',
                access_token,
                httponly=True,
                secure=False,  # 本地开发设为False,HTTPS环境设为True
                samesite='Lax'  # 防止CSRF
            )
            return response
        else:
            return jsonify({"msg": "Invalid username or password"}), 401
    else:
        return render_template('login.html')

3. 简化受保护路由逻辑

移除自定义的tokens字典和check_key_and_token函数——flask-jwt-extended已经帮你完成了token的签名验证、过期检查、身份解析,无需重复造轮子。直接用get_jwt_identity()获取登录用户信息,和路由参数的username做校验:

from flask_jwt_extended import get_jwt_identity

@app.route('/<username>/forms', methods=['GET', 'POST'])
@jwt_required()
def forms(username):
    # 获取当前登录用户的身份信息
    current_user = get_jwt_identity()
    # 校验路由参数的username和当前登录用户是否一致
    if current_user['username'] != username:
        return jsonify({"msg": "Unauthorized access"}), 403

    if request.method == 'POST':
        input_text = request.form.get('input_text')
        # 重定向时无需传token,浏览器会自动带Cookie
        return redirect(url_for('weather', username=username, city=input_text))
    else:
        return render_template('forms.html')

4. (可选)配置Cookie的过期时间

如果需要控制token的过期时间,可以在创建token时指定expires_delta,或者在全局配置中设置:

from datetime import timedelta

# 全局配置token过期时间(比如1小时)
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = timedelta(hours=1)
为什么之前的方法无效?
  • 你在重定向响应中设置的Authorization头,浏览器不会自动传递到下一个请求——这是HTTP协议的规则,重定向请求只会携带浏览器默认保留的凭证(如Cookie),不会保留自定义响应头。
  • 手动维护tokens字典容易出现一致性问题(比如token过期后未清理),而flask-jwt-extended的JWT本身包含过期时间、签名等信息,无需额外存储。

内容的提问来源于stack exchange,提问作者jon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:45:17