jwt认证生成后的token后端解析

一.首先前端发送token

token所在的位置headers

{'authorization':token的值',Content-Type':application/json}

在ajax写//只展示headers部分代码headers:{"authorization":this.$cookies.get("token")}//token值一般是放在cookies里面//ajax提交默认就是json格式所有不需要声明js格式

二.后端接受并解析token

1.首先先定义个认证类

fromrest_framework.exceptionsimportAuthenticationFailedimportjwtfromrest_framework_jwt.authenticationimportBaseJSONWebTokenAuthenticationfromrest_framework_jwt.authenticationimportjwt_decode_handlerfromrest_framework_jwt.authenticationimportget_authorization_headerclass JWTAuthentication(BaseJSONWebTokenAuthentication):# 自定义认证类,重写authenticate方法def authenticate(self, request):# 认证通过,返回user,auth# 认证失败,返回None# auth = request.META.get('HTTP_AUTHORIZATION')  # 前台用auth携带token# 通过前台传过来的请求头中获取authauth = get_authorization_header(request)ifnotauth:raiseAuthenticationFailed('Authorization 字段是必须的')try:

payload = jwt_decode_handler(auth)# 出现jwt解析异常,直接抛出异常,代表非法用户,也可以返回None,作为游客处理exceptjwt.ExpiredSignature:raiseAuthenticationFailed('token已过期')except:raiseAuthenticationFailed('token非法')

user = self.authenticate_credentials(payload)return(user, auth)

关于其中的几个方法auth = request.META.get('HTTP_AUTHORIZATION') 获取token的字符串格式auth =

get_authorization_header(reuqest对象)

获取token的二进制格式jwt_decode_handler(token的二进制格式)

如果token没有过期:返回用户信息

如果token过期:抛异常,过期的异常是jwt.ExpiredSignatureauthenticate_credentials(jwt_decode_handler解析后信息)返回user对象

2.局部调用用户认证类#评率认证类写法from rest_framework.throttling import SimpleRateThrottleclass SMSRateThrottle(SimpleRateThrottle):

scope = 'sms'    #这个是为了全局设置给予的一个变量名称

# 只对提交手机号的get方法进行限制

def get_cache_key(self, request, view):

mobile = request.query_params.get('mobile')        # 没有手机号,就不做频率限制

if not mobile:            return None

# 返回可以根据手机号动态变化,且不易重复的字符串,作为操作缓存的key

return 'throttle_%(scope)s_%(ident)s' % {'scope': self.scope, 'ident': mobile}class Test(APIView):

authentication_classes = [我们自定义用户认证的类] #如[JWTAuthentication]

#来判断登入账号的信息算游客还是正常用户

permission_classes =[IsAuthenticated]

#给与权限

#AllowAny:允许所有

#IsAuthenticated:只允许登入用户

#IsAuthenticatedOrReadOnly:游客只读,登录用户无限制

#IsAdminUser:是否是后台用户

DEFAULT_THROTTLE_RATES = [频率认证类]#如[SMSRateThrottle]

#局部评率认证

#满足以上给予的权限才可以进行下面的操作

3.全局调用用户认证类

setting.py中

#drf配置"""

AllowAny:允许所有用户

IsAuthenticated:只允许登录用户

IsAuthenticatedOrReadOnly:游客只读,登录用户无限制

IsAdminUser:是否是后台用户

"""REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': [# django默认session校验:校验规则 游客 及 登录用户# 'rest_framework.authentication.SessionAuthentication',# 'rest_framework.authentication.BasicAuthentication',# 'rest_framework_jwt.authentication.JSONWebTokenAuthentication','api.authentications.JWTAuthentication',

],'DEFAULT_PERMISSION_CLASSES': [# 'rest_framework.permissions.AllowAny',# 全局配置:一站式网站(所有操作都需要登录后才能访问)# 'rest_framework.permissions.IsAuthenticated',],'DEFAULT_THROTTLE_RATES': {'user':'5/min',# 登录的用户一分钟可以访问5次'anon':'3/min',# 游客一分钟可以访问3次'sms':'1/min'#同一个手机1分钟一次}

}

jwt配置

importdatetime

JWT_AUTH = {'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=1000),#生成token有效期'JWT_AUTH_HEADER_PREFIX':'TOKEN',

更多推荐