最近在自学Django,然后就了解到有一种叫做JWT的无状态授权方式,觉得挺合适,就稍稍了解了一下。
首先,JWT的官网应该是 jwt.io,这个网站的首页上有一个 JWT Debugger,可以在线编码/解码JWT。
具体JWT的格式我就不在这里说了,可以看上面的官网或者自行搜索。
使用 hmac-sha256 来编码官网上给出的实例的 python 代码如下:
[python]
import hmac
import hashlib
import base64
str0 = b'{"alg":"HS256","typ":"JWT"}'
str1 = b'{"sub":"1234567890","name":"John Doe","admin":true}'
eString0 = base64.b64encode(str0)
print(str(eString0))
eString1 = base64.b64encode(str1)
print(str(eString1))
msg = eString0 + b'.' + eString1
print(msg)
# key = base64.b64encode(b'secret') # Can chose whether encode key to base64 or not.
key = b'secret'
h = hmac.new(key=key, msg=msg, digestmod=hashlib.sha256)
print(h.digest())
# This is the 'Signature'
d = base64.b64encode(h.digest())
print(d)
总的来说代码是挺简单的,上面代码编译出来后的 base64 签名结尾会比官网上给出的实例签名多出一个一个 ‘=’,这时 base64 的编码特性决定的,不过需要注意的是,python 的 base64 库比较挑。比如上面的代码中,如果把最后的=去掉后,会无法使用 base64 解码。不过总的来说不影响使用。
上述的代码中,生成的不是 url safe 的 base64 字符串,在网络服务中使用,建议使用:
base64.urlsafe_b64encode(string)
base64.urlsafe_b64decode(bytes)