django rest_framework 前端网页实现Token认证

rest_framework提供了几种认证方式:Session、Token等。Session是最简单的,几乎不用写任何代码就可以是实现,Token方式其实也不复杂,网上的教程一大把,但是最后都是用Postman这类工具来实现API调用的,通过这类工具来增加HTTP头信息以回传Token。那么真正的前端网页应该怎么办呢?网上基本上就是基于Aixos来实现的,但是我就不想用Vue,纯Javascript是不能改写HTTP头的。怎么办?

首先,看一下TokenAuthentication的源码:

复制代码
auth = request.META.get('HTTP_AUTHORIZATION', b'')

它是从HTTP头中读取Authorization,其中是的内容Token(固定字) Token(值)。

那既然JavaScript不能改写头,但是能用cookie啊,所以我就通过自定义TokenAuthentication类,读取Cookie来实现。

  1. 用户登录之后先创建Token,并返回给前端。

  2. 前端把Token保存到Cookie。

复制代码
$.ajax({
    url: "login",
    type:'POST',
    data: {'username':username,'password':password},
    dataType: "json",
    success: function (data) {   //请求成功后执行的操作
        if (data.status == "SUCCESS") {
            //localStorage.setItem('token',data.token);
            $.cookie('token', data.token);
            window.location.href = '/';
        }
        else{
            alert('Invalid username or password.');
        }
    }
});

这样每次发起HTTP请求时都会把Token带上

  1. 在logout的时候把Token删除。防止失效Token仍然可以使用。
复制代码
def logout_view(request):
    request.user.auth_token.delete()
    logout(request)

    return redirect('login')
  1. 写一个自定义的TokenAuthentication类:
复制代码
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.authtoken.models import Token

class CustomTokenAuthentication(BaseAuthentication):
    keyword = 'token'

    def authenticate(self, request):
        cookie_token = request.COOKIES.get(self.keyword)

        if cookie_token is None:
            raise AuthenticationFailed('No Token Found in Cookies!')

        try:
            user_token = Token.objects.get(key=cookie_token)
            if user_token is None:
                raise AuthenticationFailed('No Token Found for Current User!')

            return (user_token.user, user_token)
        except Token.DoesNotExist:
            raise AuthenticationFailed('Token in cookie is invalidate!')

当Token未提供或者无效时,直接抛出AuthenticationFailed异常

  1. 讲自定义的类放入项目的settings,否则不生效:
复制代码
REST_FRAMEWORK = {
   'DEFAULT_AUTHENTICATION_CLASSES': (
       'bid_request_system_app.commons.authentications.CustomTokenAuthentication',
       'rest_framework.authentication.SessionAuthentication',
   ),
}
  1. 在相对应的view方法前面加上相应的注解:
复制代码
@api_view(['GET', 'POST'])
@csrf_exempt
@login_required()
@authentication_classes([CustomTokenAuthentication])
@permission_classes([IsAuthenticated, IsAdminUser])
def department_management_view(request):

这样的话就OK了。

相关推荐
jay神4 分钟前
基于 YOLOv8 的轴承缺陷检测(Web 版)
前端·人工智能·yolo
jay神12 分钟前
基于 YOLOv8 的森林火灾检测系统(Web 版)
前端·yolo
code2cat16 分钟前
HTML基础篇之第一张网页:从index.html到浏览器里的任务清单
前端·html
miss1 小时前
AI 改完不敢上线?OpenSpec 规约驱动开发实战
前端·代码规范·前端工程化
AiMan2 小时前
腾讯ima还是不可以导出左侧所有对话,只能单条导出,方法不对吗
前端
去伪存真2 小时前
并发量一高就装死?Agent 全链路“防猝死”手册
前端·agent
Moment2 小时前
AI 编程时代,聊聊我的 Mac mini 双屏桌面
前端·后端
AiMan2 小时前
先确认能不能一次把Microsofat Copilot所有内容打包一个文件导出
前端
总要学点什么2 小时前
第97篇:三维数据加载-城市建筑白模自定义着色器——让一条光带沿高度扫上去,快慢却由帧率说了算
前端·gis·webgl·cesium·着色器·空间分析·白模
上海懒图科技2 小时前
工厂厂区电子地图定位导航:厂区人车精准定位,安全合规双保障
前端·arcgis·vue