我正在关注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
答案 0 :(得分:1)
“编码” 通常是指将数据转换为其二进制表示形式(字节)。
JWT (JSON Web令牌)编码使用特定的数据结构和加密签名来允许安全的,经过身份验证的交换。
将数据编码为 JWT 的步骤如下:
[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}})的编码方式类似。更多信息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'>
)