Json jwt 令牌问题 - TypeError:“用户”类型的对象不是 JSON 可序列化的
Posted
技术标签:
【中文标题】Json jwt 令牌问题 - TypeError:“用户”类型的对象不是 JSON 可序列化的【英文标题】:Json jwt token problem - TypeError: Object of type 'User' is not JSON serializable 【发布时间】:2020-09-23 18:58:08 【问题描述】:我正在尝试将令牌附加到已登录的用户:
user_info = request.get_json()
entered_username = User.query.filter_by(username = user_info['username']).first()
if user_info['password'] == entered_username.password:
token = jwt.encode('username':entered_username, 'exp':datetime.datetime.utcnow() + datetime.timedelta(minutes=30),
secret_key, algorithm='HS256').decode('UTF-8')
return jsonify(token)
但我得到:TypeError: Object of type 'User' is not JSON serializable.
我也试过return jsonify(token.decode('UTF-8'))
我错过了什么?
【问题讨论】:
就是这么说的:您不能将User
对象编码为JSON,而entered_username
是User
对象。如果您只想在令牌中使用用户名,请编码 'username': user_info['username'], ...
。
你的意思是全部吗?我试过'username': user_info['username'], ....decode('UTF-8') but then i get AttributeError: 'dict' object has no attribute 'decode'
是的,省略号表示代码的其余部分,而不是字面上的 ...
。我也不确定你为什么要在这里打电话给decode
。
不,我指的是 的其余部分或整个代码的其余部分。不是……哈哈。我得到同样的编码。
【参考方案1】:
您不能将 User
对象编码为 JSON,而 entered_username
是 User
对象。如果您只想要令牌中的用户名,您可以执行以下操作:
user_info = request.get_json()
user_obj = User.query.filter_by(username = user_info['username']).first()
if user_info['password'] == user_obj.password:
claims =
'username': user_info['username'], # or perhaps user_obj.username
'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30)
token = jwt.encode(claims, secret_key, algorithm='HS256')
# Maybe some error checking here?
response =
'token': token.decode()
return jsonify(response)
【讨论】:
以上是关于Json jwt 令牌问题 - TypeError:“用户”类型的对象不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章
jwt.encode 失败并显示“'bytes' 类型的对象不是 JSON 可序列化的”
使用 JWT(JSON Web 令牌)设置令牌到期的 RESTful API