DRF-认证-使用jwt生成token:使用jwt生成token,jwt的使用,python的jwt模块使用
2023-12-20 14:48:22
使用原生的jwt来生成drf的token
1、生成token方法: base/token.py
import jwt
import time
salt = '^&SG$%43ygfudytgf$%^%8743gds'
def create_token(user_id, timeout=None):
'''
:param phone_number: 传递患者的手机号码
:param timeout: token有效时间,默认是30天
:return:
'''
jwt_exp = 30*24*60*60
if timeout == None:
#没有指定过期时间,就使用配置的时间戳
timeout = jwt_exp
elif type(timeout) != int:
#传递的类型有误,使用配置中的时间戳
timeout = jwt_exp
# 构造header
headers = {
'type': 'jwt',
'alg': 'HS256'
}
# 构造payload
payload = {
'id': user_id,
'exp': time.time() + timeout
}
#构造token
token = jwt.encode(payload=payload, key=salt, algorithm=headers.get('alg'), headers=headers).decode('utf-8')
return token
#解析token获取用户id
def decode_token(token:str):
#加密用的盐
try:
payload = jwt.decode(token, salt, True)
expire = payload.get('exp')
now_time = time.time()
except Exception:
return {'code':410,'error':'token非法'}
if now_time>expire:
return {'code':410,'error':'token已经过期了'}
else:
#用户id
return payload.get('id')
if __name__ == '__main__':
token = create_token(1)
user_id = decode_token(token)
print('生成的token:',token)
print('解析token拿到的用户id:',user_id)
2、在drf项目中使用: base/authenticate.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.generics import GenericAPIView
import jwt
from base.token import salt
import time
# 用户表模型类
from apps.patient.models import PatientModel
'''1、认证相关的'''
class AppletAuthentication(BaseAuthentication):
def authenticate(self, request):
'''
所有token错误的状态码都是410,前端拿到状态码是410时要跳转到登录界面
:param request:
:return:
'''
token = request.META.get("HTTP_TOKEN") # 从请求头中获取
if not token:
token = request.COOKIES.get('token')
if not token:
msg = '没有携带token'
raise AuthenticationFailed('没有携带token')
'''
1、切割
2、解密第二段/判断过期
3、验证第三段合法性
'''
code = 410
try:
payload = jwt.decode(token, salt)
id = payload.get('user_id')
exp = payload.get('exp')
users = PatientModel.objects.filter(id=id).first()
if users:
now_time = time.time()
if now_time > exp:
raise AuthenticationFailed('token已经过期了')
return (users,token)
else:
raise AuthenticationFailed('token有问题,请重新登录1')
except Exception as e:
print(e)
raise AuthenticationFailed('token非法,请重新登录2')
文章来源:https://blog.csdn.net/weixin_46371752/article/details/135103444
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!