一、JWT简介和使用场景
二、JWT编码
三、JWT解码
四、JWT生成token验证
一、 JWT简介和使用场景
JWT全称为Json Web Token,用以Json的方式传输信息,使用秘钥(HMAC算法)/RSA/ECDSA的公钥和私钥进行签名。
用户登录后,每次请求时,客户端都携带JWT生成的Token到服务器,服务器经过计算验证,确定该信息是否合法从而进行鉴权,简单理解为在客户端和服务端通过Json格式传递鉴权信息,与Session不同,JWT不需要存储在服务端。
二、JWT编码
JWT编码即生成TOKEN:
1.headers
headers={"alg":"HS256", #使用的算法
"typ": "JWT" #TOKEN类别
}
2.pyload
- 共有声明(按需要添加,一般是用exp)
{
'exp' : xxx, #生成token的过期时间的时间戳
'iss' : xxx, #token的签发者
'iat' : xxx, #创建时间的时间戳
'aud': xxx #token签发面向的群体
}
- 私有声明(自定义key,value)
{
'username' :'rachel'
}
查看代码
class jwt_operate():
def __init__(self):
self.salt='123456'
self.exp=time.time()+60*60*12
#生成token
def jwt_encode(self):
headers={"alg":"HS256", #使用的算法
"typ": "JWT" #TOKEN类别
}
pyload={"name":"john Doe", "exp":self.exp }
token=jwt.encode(payload=pyload,key=self.salt,headers=headers,algorithm='HS256')
print(token)
return token
结果如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiam9obiBEb2UiLCJleHAiOjE2OTg5NzQ0MDMuNzgxNDg1M30.N3aiqpxgW6d-rtxfxPLpYbtzVB0vFZv6S59sAawqW54
三、JWT解码
对“二、JWT编码”中的生成的token进行解密,代码过程:
def jwt_decode(self):
token=self.jwt_encode()
pyload=jwt.decode(token,key=self.salt,algorithms='HS256',options={"verify_signature": False})
print(pyload)
四、JWT生成token验证
token验证的官网:JSON Web Tokens - jwt.io
如上图所示,生成的token是一串base64编码,通过点号"."分割成三部分,分别为:Header,Pyload,Signature。
Header,Pyload仅进行了BASE64编码,可以用BASE64解码,所以不要存储敏感信息。Signature是把Header和Pyload密文通过“.”拼接起来,然后进行HS256加密,然后再进行base64url加密,最终得到token的第三段。
代码实现:
def test_token(self):
token=self.jwt_encode()
header,pyload,sign=token.split('.')
header_pyload=token.rsplit('.',1)[0]
print(header,pyload,sign)
#header解码
dec_headers=base64.b64decode(header).decode('utf-8')
print(dec_headers)
#pyload解码
remainder=4-len(pyload)%4
if remainder:
pyload+="="*remainder
dec_pyload=base64.b64decode(pyload).decode('utf-8')
print(dec_pyload)
message=header_pyload.encode("utf-8")
key=self.salt.encode("utf-8")
hm=hmac.new(key,message,digestmod=sha256)
sign=base64.b64encode(hm.digest()).decode()
print(sign)
运行结果:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 eyJuYW1lIjoiam9obiBEb2UiLCJleHAiOjE2OTkwMjExODkuNzA4NDk3NX0 VAbVJ4XQ061Rm3qTQsO0rQdduAVhCjWdStkoNat_vmE
{"alg":"HS256","typ":"JWT"}
{"name":"john Doe","exp":1699021189.7084975}
VAbVJ4XQ061Rm3qTQsO0rQdduAVhCjWdStkoNat_vmE=