自定义基于jwt的验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | # 3 自定义基于jwt的权限类 from rest_framework.authentication import BaseAuthentication # 基于它 from rest_framework_jwt.authentication import BaseJSONWebTokenAuthentication # 基于它 from rest_framework.exceptions import AuthenticationFailed # from rest_framework_jwt.authentication import jwt_decode_handler from rest_framework_jwt.utils import jwt_decode_handler # 跟上面是一个 import jwt from api import models # class MyJwtAuthentication(BaseAuthentication): # def authenticate(self, request): # jwt_value=request.META.get('HTTP_AUTHORIZATION') # if jwt_value: # try: # #jwt提供了通过三段token,取出payload的方法,并且有校验功能 # payload=jwt_decode_handler(jwt_value) # except jwt.ExpiredSignature: # raise AuthenticationFailed('签名过期') # except jwt.InvalidTokenError: # raise AuthenticationFailed('用户非法') # except Exception as e: # # 所有异常都会走到这 # raise AuthenticationFailed(str(e)) # # 因为payload就是用户信息的字典 # print(payload) # # return payload, jwt_value # # 需要得到user对象, # # 第一种,去数据库查 # # user=models.User.objects.get(pk=payload.get('user_id')) # # 第二种不查库 # user=models.User(id=payload.get('user_id'),username=payload.get('username')) # return user,jwt_value # # 没有值,直接抛异常 # raise AuthenticationFailed('您没有携带认证信息') class MyJwtAuthentication(BaseJSONWebTokenAuthentication): def authenticate( self , request): jwt_value = request.META.get( 'HTTP_AUTHORIZATION' ) if jwt_value: try : #jwt提供了通过三段token,取出payload的方法,并且有校验功能 payload = jwt_decode_handler(jwt_value) except jwt.ExpiredSignature: raise AuthenticationFailed( '签名过期' ) except jwt.InvalidTokenError: raise AuthenticationFailed( '用户非法' ) except Exception as e: # 所有异常都会走到这 raise AuthenticationFailed( str (e)) user = self .authenticate_credentials(payload) return user,jwt_value # 没有值,直接抛异常 raise AuthenticationFailed( '您没有携带认证信息' ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)