Django Knox认证中如何验证请求头携带的token
方案1:直接使用Knox内置认证类(推荐)
Knox本身已经封装好了完整的token校验逻辑,不需要手动解析请求头的Authorization字段,只需要给需要登录权限的视图配置对应的认证类和权限类即可:
- 如果是DRF的APIView类视图,直接在视图里加如下配置:
from knox.auth import TokenAuthentication from rest_framework.permissions import IsAuthenticated class YourQuizView(APIView): # 配置Knox的token认证类 authentication_classes = (TokenAuthentication,) # 配置必须登录的权限 permission_classes = (IsAuthenticated,) def dispatch(self, request, *args, **kwargs): self.quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name']) # 认证通过后直接可以从request.user拿到当前登录用户 current_user = request.user print(current_user.id, current_user.username) return super().dispatch(request, *args, **kwargs)
配置完成后,请求进来时DRF会自动调用Knox的认证逻辑校验token有效性,token无效会直接返回401错误,不需要自己处理校验逻辑。
方案2:手动调用Knox接口校验token
如果你确实有自定义场景需要手动校验提取到的token,可以直接调用Knox的TokenAuthentication类的authenticate_credentials方法完成校验:
from knox.auth import TokenAuthentication from rest_framework.exceptions import AuthenticationFailed def dispatch(self, request, *args, **kwargs): self.quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name']) try: auth_method, token = self.request.META['HTTP_AUTHORIZATION'].split(' ', 1) # 调用Knox的校验方法,传入提取到的token字符串 user, auth_token = TokenAuthentication().authenticate_credentials(token.encode()) # 校验通过,user就是当前登录的用户对象,手动绑定到request上即可 request.user = user except ValueError: # Authorization头格式错误 raise AuthenticationFailed("无效的Authorization头格式") except AuthenticationFailed as e: # token过期、无效、不存在等情况 raise AuthenticationFailed(f"认证失败:{str(e)}") # 后续逻辑可以直接用request.user获取用户信息 return super().dispatch(request, *args, **kwargs)
注意事项
- 不需要额外调用
login()方法,只要拿到校验通过的user对象,DRF的请求上下文就可以正常识别用户身份 - 校验过程抛出的
AuthenticationFailed异常DRF会自动处理为401响应,符合REST规范 - Knox的token本身已经实现了过期校验、加密存储等逻辑,不需要自己额外实现校验规则
内容的提问来源于stack exchange,提问作者stackoverflow rohit
相关产品推荐
相关产品推荐

