Flask接口配置token_required后POST请求提示Token缺失怎么解决
问题根因
你实现的token_required装饰器仅通过request.args.get('token')读取URL查询参数中的token,而你是将token放在请求头中传输,代码无法读取到传入的token,因此直接返回Token is missing!错误。
修复方案
1. 更新token_required装饰器逻辑
适配标准的Bearer认证请求头格式,同时可兼容原有的URL参数传参方式,修改后代码如下:
from flask import Flask, request, jsonify import jwt from functools import wraps def token_required(f): @wraps(f) def decorated(*args, **kwargs): token = None # 优先从Authorization请求头获取Bearer格式的token if 'Authorization' in request.headers: auth_val = request.headers.get('Authorization') if auth_val.startswith('Bearer '): token = auth_val.split(' ')[1] # 兜底从URL查询参数获取token if not token: token = request.args.get('token') if not token: return jsonify({'message': 'Token is missing!'}), 403 try: # PyJWT 2.x及以上版本必须明确指定解码算法,和你签发token时的算法保持一致即可 data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"]) except Exception as e: return jsonify({'message': 'Token is invalid'}), 403 return f(*args, **kwargs) return decorated
2. 验证Insomnia请求配置
两种传参方式任选其一即可:
- 选择Bearer Authentication认证类型:直接在Token输入框填入你签发的JWT字符串,不需要额外加
Bearer前缀 - 手动添加请求头:Header名填写
Authorization,Header值填写Bearer 你的JWT字符串,注意Bearer和JWT字符串之间必须有一个英文空格
可选排查手段
如果修改后依然报错,可以在装饰器的token = None行之后加一行打印代码print(request.headers),运行Flask服务后发起请求,查看控制台输出的请求头中是否包含正确的Authorization字段,定位是否是请求端配置问题。
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

