Object of type bytes is not JSON serializable-jwt token报错问题咨询
报错原因定位
该Object of type bytes is not JSON serializable报错核心来自两处逻辑错误:
- jwt.decode方法参数传递错误:原代码中
jwt.decode(token, app.config, ['SECRET_KEY'], algorithms = "HS256")不符合pyjwt的参数规范。decode方法的第二个参数应为签名密钥本身app.config['SECRET_KEY'],代码错误传入了整个app.config配置对象,多余传入的['SECRET_KEY']作为第三个参数会导致解密结果格式异常,出现bytes类型的返回值,后续jsonify序列化时就会触发类型错误。 - 裸异常捕获掩盖了具体问题:代码使用了无指定类型的
except,无法区分是token解码错误、签名错误还是返回值类型错误,无法定位根因。 - 额外排查点:如果生成JWT的逻辑中payload字段传入了bytes类型的值,解码后的数据中也会保留bytes类型,序列化时同样会触发该报错。
修复步骤
- 修正jwt.decode的参数配置,替换原有解码逻辑
- 拆分异常捕获类型,方便后续问题定位
- 校验JWT生成逻辑,确保payload内所有字段均为字符串、数字等可JSON序列化的基础类型
修复后完整装饰器代码
from functools import wraps import jwt from flask import request, jsonify def jwt_required(func): @wraps(func) def jwt_required_wrapper(*args, **kwargs): token = request.args.get('token') if not token: return jsonify( { 'message' : 'Token is missing'} ), 401 try: # 修正参数:传入单独的SECRET_KEY,algorithms参数传数组格式 data = jwt.decode(token, app.config['SECRET_KEY'], algorithms = ["HS256"]) except jwt.ExpiredSignatureError: return jsonify( { 'message' : 'Token has expired'} ), 401 except jwt.InvalidTokenError: return jsonify( { 'message' : 'Token is invalid'} ), 401 return func(*args, **kwargs) return jwt_required_wrapper
Postman请求校验
发起GET请求时确认url参数中的token是完整的JWT字符串,不要带多余的引号、空格或编码符号。
内容的提问来源于stack exchange,提问作者Diarmuid Okane
相关产品推荐
相关产品推荐

