(一)、概述
- Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。在python中多用pyJWT,地址:https://jwt.io/
不用drf中token的原因:drf中虽然也提供了token,但是token生成之后是永久有效的,没有失效期,并且该token可以被前端js解析,这样在使用中很可能被截获,造成用户信息隐私信息的泄漏
(二)、用法
导入:pip3 install pyJWT
- 在项目的根目录下创建utils文件夹,在文件夹中创建jwt_auth.py文件,在该文件中编写token的生成加密与解密
- 加密生成token
- salt:加盐,盐自己定义字符串,这个是必须的
- headers:包括’typ’: ‘jwt’ 和 ‘alg’: ‘HS256’两个参数,headers也可以不写,默认就是这个
- payload:包括需要返回参数和exp过期时间,需要注意的是:’exp’: datetime.datetime.utcnow() + datetime.timedelta(minutes=time),必须是utcnow(),并且过期时间的单位可以是days/minutes等
- result:result = jwt.encode(payload=payload, key=SALT, algorithm=’HS256’, headers=headers)
- 解密:
- 解密:使用decode
- 参数1:token
- 参数2:salt
- 参数3:algorithms=[‘HS256’],这里必须加上s
- exceptions.ExpiredSignatureError:时间已过期,时效
- jwt.DecodeError:token认证失败
- jwt.InvalidTokenError:token不合法 ```python import jwt import datetime from jwt import exceptions
- 解密:使用decode
SALT = “rewoowerhsniqwheorhqwhwqopqeoriopodszsdajv\ wyxvhimhejwygcsdmbewnmwebnmlasoewuxzbcnway”
def create_jwt(user_id, username, time): “”” 传入参数生成jwt “””
headers = {'typ': 'jwt','alg': 'HS256'}payload = {'user_id': user_id,'username': username,'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=time)}result = jwt.encode(payload=payload, key=SALT,algorithm='HS256', headers=headers)return result
def validate_jwt(token): “”” 校验token “””
payload = Nonetry:payload = jwt.decode(token, SALT, algorithms=['HS256'])except exceptions.ExpiredSignatureError:return "token已生效"except jwt.DecodeError:return "token认证失败"except jwt.InvalidTokenError:return "token不合法"return payload
```
