验证的时候,继承BaseAuthentication类,重写一下验证方法:
# app_auth.py from users.models import User class MyJSONWebTokenAuthentication(BaseAuthentication): def authenticate(self, request): jwt_value = get_authorization_header(request) if not jwt_value: raise AuthenticationFailed('Authorization 字段是必须的') try: payload = jwt_decode_handler(jwt_value) except jwt.ExpiredSignature: raise AuthenticationFailed('签名过期') except jwt.InvalidTokenError: raise AuthenticationFailed('非法用户') username = jwt_get_username_from_payload(payload) print(username) user = User.objects.filter(username=username).first() print(user) return user, jwt_value然后你的某一个视图必须登录后才可以访问,把他添加到认证中就OK了。
from users.app_auth import JSONWebTokenAuthentication,MyJSONWebTokenAuthentication class OrderView(APIView): # authentication_classes = [JSONWebTokenAuthentication] # 不用默认的了,用我们自己的 authentication_classes = [MyJSONWebTokenAuthentication] # 由于不是auth_user表,所以不需要判断是否为匿名用户。 def get(self,request): print(request.user) return CommonResponse('100', '成功',{'数据':'测试'}) 最后我想说1.注意前缀,JWT开头,一个空格,后面是JWT的token字符串
2.如果你不用auth组件,则需要手动生成JWT的token字符串与手动进行校验。这很麻烦,所幸JWT这个模块给我们很多方便之处。