Flask应用JWT认证跳转报Missing Authorization Header如何解决?
问题根源
你遇到的「Missing Authorization Header」报错,核心原因有两个:
@jwt_required()装饰器默认仅从请求头的Authorization字段读取JWT,但你在重定向时给响应头加的Authorization,浏览器不会自动携带到后续的重定向请求里——浏览器重定向只会自动传递Cookie这类符合规范的凭证,不会保留自定义响应头。- 通过URL参数传递token是不安全的(会被记录到日志、浏览器历史、Referer头中),且和flask-jwt-extended的默认认证逻辑不匹配。
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
相关产品推荐
相关产品推荐

