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_usernameUser 对象。如果您只想在令牌中使用用户名,请编码 '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_usernameUser 对象。如果您只想要令牌中的用户名,您可以执行以下操作:

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 可序列化的”

Angular JWT 令牌解析为 json 问题

使用 JWT(JSON Web 令牌)设置令牌到期的 RESTful API

Json Web 令牌 JWT

JSON Web 令牌 (JWT):我应该使用响应标头还是正文进行令牌传输?

关于 JSON Web 令牌 (JWT) 的安全性和可靠性问题