在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token认证机制。
很多公司开发的一些移动端可能不支持cookie,并且我们通过cookie和session做接口登录认证的话,效率其实并不是很高,我们的接口可能提供给多个客户端,session数据保存在服务端,那么就需要每次都调用session数据进行验证,比较耗时,所以引入了token认证的概念,我们也可以通过token来完成,我们来看看jwt是怎么玩的。
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JWT的构成
JWT就一段字符串,由三段信息构成的,将这三段信息文本用.
链接一起就构成了Jwt字符串。
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
jwt的头部承载两部分信息:
- 声明类型,这里是jwt
- 声明加密的算法 通常直接使用 HMAC SHA256
payload
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息可以存放下面三个部分信息。
- 标准中注册的声明
- 公共的声明
- 私有的声明
signature
JWT的第三部分是一个签证信息,这个签证信息由三部分组成:
- header (base64后的)
- payload (base64后的)
- secret密钥
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
jwt的优点: 1. 实现分布式的单点登陆非常方便 2. 数据实际保存在客户端,所以我们可以分担都武器的存储压力 3. JWT不仅可用于认证,还可用于信息交换。善用JWT有助于减少服务器请求数据库的次数,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。 jwt的缺点: 1. 数据保存在了客户端,我们服务端只认jwt,不识别客户端。 2. jwt可以设置过期时间,但是因为数据保存在了客户端,所以对于过期时间不好调整。
这里是直接封装了一下
import jwt
class Jwt_token:
def __init__(self)->None:
self.secret_key="!@#$%^%$#$%$#$%(*&^#@¥%¥#@¥@#¥%……¥#@#!@#¥%"
# 生成token
def create_token(self,data):
return jwt.encode(data,self.secret_key,algorithm='HS256')
# 解析token
def jiexi_token(self,token):
return jwt.decode(token,self.secret_key,algorithms='HS256')
# 对比token
def check_token(self,token):
try:
payload = jwt.decode(token,self.secret_key,algorithms='HS256')
newtoken = jwt.encode(payload,self.secret_key, algorithm='HS256')
if newtoken == token:
return True
except:
pass
return False
jwt_token = Jwt_token()
# data = {"data":{"user_id":1,"username":"张三"}}
# token = jwt_token.create_token(data)
# print(token)
# to_token = jwt_token.jiexi_token(token)
# print(to_token)
# aa = jwt_token.check_token(token)
# print(aa)
当然,也可以在settings里配置