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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。