【问题标题】:Decoding and encoding JSON in Django在 Django 中解码和编码 JSON
【发布时间】:2019-06-02 11:11:57
【问题描述】:

我在关注一些 django rest 框架教程,发现了一些晦涩难懂的代码。这个 sn-p 来自定制的用户模型,该项目使用 jwt 进行身份验证。

正如我在 sn-p 中评论的那样,我无法注意到他们首先对数据进行编码并再次对其进行解码的原因。我认为这种模式不仅是本教程特有的,而且是相当普遍的模式。谁能给我解释一下?

 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

【问题讨论】:

    标签: django django-rest-framework jwt


    【解决方案1】:

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

    JWT (JSON Web Token) 编码使用特定的数据结构和加密签名来实现安全、经过身份验证的交换。

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

    1. payload 被转换为 json 并使用 base64 编码。
    2. 标头,指定令牌类型(例如jwt)和要使用的签名算法(例如HS256 ),编码类似。
    3. 签名源自您的私钥和之前的两个值。
    4. 结果是通过用点连接头、有效负载和签名来获得的。输出是一个二进制字符串

    更多信息here.

    使用 UTF-8 解码将这个二进制字符串转换为 Unicode 字符串:

    >>> 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'>
    

    注意事项:

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

    • 二进制字符串在 Python 解释器中以 b 为前缀(例如,b"a binary string"

    【讨论】:

    • 请更正您的答案。编码和加密是两个不同的东西!这里没有加密。 JWT/JWS 的标头和有效负载仅经过 base64url 编码,签名是哈希,也没有加密。
    • @jps 已编辑。我不知道 jwt,我以为看错了作者提供的代码。谢谢
    • 我没有看到问题中提到的“加密”。您的编辑也不正确。签名不是密钥的散列,而是标头和有效负载的散列。只有当你知道主题时,你才应该回答。
    猜你喜欢
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多