在Django中解码和编码JSON

时间:2019-01-07 19:03:52

标签: django django-rest-framework jwt

我正在关注django rest框架教程,发现一些晦涩的代码。该摘录来自定制的用户模型,该项目使用jwt进行身份验证。

正如我在代码段中评论的那样,我不知道它们为什么首先对数据进行编码然后再次对其进行解码的原因。我认为这种模式不仅是本教程特有的,而且是一种通用模式。有人可以解释一下吗?

 def _generate_jwt_token(self):
        """
        Generates a JSON Web Token that stores this user's ID and 
        has an expiry date set to 60 days into the future.
        """
        dt = datetime.now() + timedelta(days=60)


        token = jwt.encode({ #first encode here
            'id': self.pk,
            'exp': int(dt.strftime('%s'))
        }, settings.SECRET_KEY, algorithm='HS256')

        return token.decode('utf-8') #returns decoded object

1 个答案:

答案 0 :(得分:1)

“编码” 通常是指将数据转换为其二进制表示形式(字节)。

JWT (JSON Web令牌)编码使用特定的数据结构和加密签名来允许安全的,经过身份验证的交换。

将数据编码为 JWT 的步骤如下:

  1. 有效载荷被转换为json并使用base64进行编码。
  2. 标头,指定令牌类型(例如[1.0, 1.83665564, 0.08347845, 1.14112001, 0.09442164, 1.85090352, 0.7205845, 1.95637593, 0.23174534, 1.41211849, 0.01196838, 1.67022918, 0.46342708, 1.99991186, 0.44121095, 1.65028784, 0.00822115, 1.43616476, 0.24901275, 1.96379539] )和要使用的签名算法(例如{ {1}})的编码方式类似。
  3. 签名是从您的私钥和之前的两个值得出的。
  4. 通过将标头,有效负载和签名与点连接在一起来获得结果。输出为二进制字符串

更多信息here

使用UTF-8对其进行解码会将此二进制字符串转换为Unicode字符串:

jwt

注意:

  • 并非总是可以将字节解码为字符串。对数据进行Base64编码后,您可以将任何字节存储为文本表示形式,但是编码形式比原始表示形式需要更多的空间(+33%)。

  • Python解释器中的二进制字符串以HS256为前缀(例如>>> encoded_bin = jwt.encode({'some': 'data'}, 'secret_sig', algorithm='HS256') >>> type(encoded_bin) <class 'bytes'> >>> encoded_string = encoded_bin.decode('utf-8') >>> type(encoded_string) <class 'str'>