Flask调用JWT保护接口提示Missing cookie access_token_cookie解决方法
问题根因
该报错来自Flask-JWT-Extended扩展,默认配置下它会优先从cookie中读取access_token_cookie,如果你的项目是前后端分离架构,前端请求没有自动携带cookie、或者跨域配置不支持凭证传递,就会触发这个错误。你在all_tours接口中添加的代码无效,因为set_access_cookies是给响应添加Cookie存储标识,无法解决请求阶段的token读取问题。
可行解决方案
方案1:优先用请求头传token(推荐前后端分离场景使用,完全规避cookie跨域问题)
直接修改Flask-JWT-Extended全局配置,指定仅从请求头的Authorization字段读取token,就不会再校验cookie:
# 在你初始化app的代码中添加以下配置 app.config['JWT_TOKEN_LOCATION'] = ['headers'] app.config['JWT_HEADER_NAME'] = 'Authorization' app.config['JWT_HEADER_TYPE'] = 'Bearer'
配置完成后前端请求all_tours接口时,只要在请求头中带上Authorization: Bearer <登录接口返回的access_token>即可正常访问。
方案2:如果要保留cookie校验模式,按以下步骤调整
- 先补全Flask-JWT-Extended全局配置:
app.config['JWT_TOKEN_LOCATION'] = ['cookies', 'headers'] # 同时支持两种取token方式 app.config['JWT_COOKIE_CSRF_PROTECT'] = False # 开发环境可关闭CSRF校验,生产按需开启 app.config['JWT_ACCESS_COOKIE_NAME'] = 'access_token_cookie'
- 修正
all_tours接口的跨域配置,允许跨域传递凭证:
@app.route("/admin/all_tours") @jwt_required() def all_tours(): all_tours = Tour.query.filter_by(owner=get_jwt_identity()).all() response = jsonify(all_tours=[i.serialize for i in all_tours]) response.headers.add('Access-Control-Allow-Origin', 'http://localhost:3000') # 新增允许凭证的头 response.headers['Access-Control-Allow-Credentials'] = 'true' return response
也可以直接安装flask-cors做全局配置,避免每个接口重复加头:
pip install flask-cors
# app初始化时添加 from flask_cors import CORS CORS(app, supports_credentials=True, origins=['http://localhost:3000'])
- 前端请求必须开启凭证传递配置:
- axios场景:请求参数添加
withCredentials: true - fetch场景:请求参数添加
credentials: 'include'
内容的提问来源于stack exchange,提问作者Sabina
相关产品推荐
相关产品推荐

