jwt.encode 失败并显示“'bytes' 类型的对象不是 JSON 可序列化的”

Posted

技术标签:

【中文标题】jwt.encode 失败并显示“\'bytes\' 类型的对象不是 JSON 可序列化的”【英文标题】:jwt.encode fails with "Object of type 'bytes' is not JSON serializable"jwt.encode 失败并显示“'bytes' 类型的对象不是 JSON 可序列化的” 【发布时间】:2018-10-10 19:13:16 【问题描述】:

我试图在我的用户成功登录后向他们返回一个令牌,但不断收到以下错误:

TypeError: Object of type 'bytes' is not JSON serializable

我该如何解决?到目前为止,这是我的代码:

   if user:
        selected_user = 
            'email': user.__dict__['email'],
            'password': user.__dict__['password'],
            'account_type': user.__dict__['account_type'],
            'token': ''
        

        if bcrypt.checkpw(request.data['password'].encode('utf8'), selected_user['password'].encode('utf8')):
            payload = 
                'email': selected_user.email,
                'account_type': selected_user.account_type
            
            selected_user['token'] = jwt.encode(payload, "SECRET_KEY")
            response_details = 
                'data': selected_user,
                'message': 'Login successful.',
                'code': '200',
                'status': HTTP_200_OK
            
            return Response(response_details, status=response_details['status'])
        else:
            response_details = 
                'message': "Invalid password.",
                'code': "400",
                'status': HTTP_400_BAD_REQUEST
            
            return Response(response_details, status=response_details['status'])
    else:
        response_details = 
            'message': "Invalid email and password combination.",
            'code': "400",
            'status': HTTP_400_BAD_REQUEST
        
        return Response(response_details, status=response_details['status'])

【问题讨论】:

你能在问题中逐字复制粘贴错误信息吗? 这是它基于的模型:pastebin.com/wGZBzAUN。它们都不是bytes 类型。 这里是错误信息:pastebin.com/kjCzMYcP 【参考方案1】:

旧版本的 PyJWT 中,例如 1.7 decode 是最后需要的:

jwt.encode(payload, "SECRET_KEY", algorithm='HS256').decode('utf-8')

如果您使用的是最近的版本,如 2.3.1,则无需转储或解码,将生成一个已在 UTF-8 中的字符串

【讨论】:

【参考方案2】:

尝试导入 json,然后在返回时使用 json.dumps(response_details):

 return Response(json.dumps(response_details), status=response_details['status'])

【讨论】:

在代码中没有达到这一点,在客户端我得到500 (Internal Server Error) 这个错误确实会抛出一个内部服务器错误,即使它发生在返回方法上

以上是关于jwt.encode 失败并显示“'bytes' 类型的对象不是 JSON 可序列化的”的主要内容,如果未能解决你的问题,请参考以下文章

sqlalchemy ORM 调用失败并出现 TypeError: expected bytes, str found

JWT(Json WEB Token)

cakephp 中的 JWT 令牌解码

如何确定 PyJWT 的版本?

使用 PHP:JWT INSIDE A 函数

如何使用完全自定义的有效负载制作 JWT