先理解他是什么:
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,通用性比较好,由header,payload,signature组成
再解释下什么是头部、载荷、签证:
头部用来声明类型和加密算法,载荷用来存储有效信息,签证包括头部 载荷和secret, 这个secret用来签发token和验证token,保存在服务端(比如redis)中 (它是存放在服务端的私钥,校验token也是以secret为依据),(将签发凭证保存到redis中,后续可以持久化的方式进行保存)
jwt的流程:
1.client携带用户名,密码向server发起请求
2.server生成一个token返回给前端,自己在服务器保存一个secret
3.client再次向server发起请求的时候,server会取出请求的头部和载荷进行加密算法得到secret,看结果是否与之前保存的secret一致,这样就可以保证头部和载荷的信息如果被改动,secret肯定不会一致
4.加密之后的secret与之前保存的secret一致, 返回成功的响应
应用场景:
举个例子,比如说我们需要记录用户的登录状态,我们只需要取到用户的name和密码来进行加密校验secret
(本人水平有限,这是本人对jwt的理解,参考要慎重哦)
使用python的PyJWT
import jwt
import time
secret = b'\x7d\xef\x87\xd5\xf8\xbb\xff\xfc\x80\x91\x06\x91\xfd\xfc\xed\x69'
expire_time = int(time.time() + 3600) # 从现在开始 , 1小时后超时
def encode_jwt(user_id, status):
payload = {'id': user_id, 'exp': expire_time, 'status': status}
encoded = jwt.encode(payload, secret, algorithm='HS256')
encoded_jwt = str(encoded, encoding='ascii')
return encoded_jwt
def decode_jwt(token):
payload = jwt.decode(token, secret, algorithm='HS256')
return payload