用Django全栈开发(进阶篇)——11. Django REST framework实现Token验证

大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程的进阶版

很抱歉这篇文章更新的晚了,原因是皮爷这段时间一直在日本换工作,经过一个月的煎熬,最后终于拿到了想要去的公司的offer。以后可以将peekpa.com和工作相结合,创建更加牛逼的peekpa.com 同时为大家制作更加详细的,有内容的教程。

在之前《用Django全栈开发》系列专辑里面,皮爷详细的阐述了如何编写一个完整的网站,具体效果可以浏览线上网站:Peekpa.com

从进阶篇开始,每一篇文章都是干货满满,干的不行。这一节,我们来说:如何通过Django REST Framework来实现Token验证。为我们的前后端分离做最后的准备

Peekpa.com的官方地址:http://peekpa.com

获取整套教程源码唯一途径,关注『皮爷撸码』,回复『peekpa.com』

皮爷的每一篇文章,都配置相对应的代码。这篇文章的代码对应的Tag是“Advanced_11”。

title.jpeg

背景了解

我们这里所说的验证,英文实际是Authentication。为什么要提到这个?原因很简单,在未来我们前后端分离的程序中,当我们前端登录了后台系统之后,随后每一次发送的HTTP请求,我们都要想一个办法来确认这个HTTP请求正好是那个登录过的人发送的,而不是中间黑客劫持或者伪造的,这样,我们就需要让HTTP请求在发送的过程中,携带一个验证身份的东西,这个验证身份的东西,就是我们今天所说的Token Authentication。

当然,在实际的生产过程中,我们的验证方式其实有很多,但是这里我们就先拿来Django REST Framework提供的TokenAuthentication来试验一下。

相关的TokenAuthentication参考文档,可以去查阅官方文档:

https://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication

我们这里想要验证的,当然就是我们当时前后端分离的数据中心页面了。

集成Token Authentication

第一步,当然是要修改我们的setting.py文件了。我们需要将以下内容添加进去:

INSTALLED_APPS = [
    ### ...先前内容省略...
    'rest_framework.authtoken',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

这里简单说明一下:

  • DEFAULT_AUTHENTICATION_CLASSES这个是:
  • DEFAULT_PERMISSION_CLASSES这个是:

然后,我们需要修改我们的User Model,即peekpauser/model.py文件里,我们需要添加以下内容:

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

这里的功能就是,当我们创建一个用户的时候,我们就会创建自动创建一个Token,并且这个Token关联到这个用户的。

既然我们修改了Model,而且我们也在INSTALLED_APPS里面也添加了新的rest_framework.authtoken,那么我们接下来就要执行python manage.py makemigrationspython manage.py migrate了,执行完成,我们会在数据库中生成Authon Token的表格:

001

接下来一步,我们在peekpauser目录下,创建一个admin.py文件,并将下面的代码放进去:

from django.contrib import admin
from .models import User

class PeekpaUserAdmin(admin.ModelAdmin):
    pass
admin.site.register(User, PeekpaUserAdmin)

这样做的目的是在我们的Django自带的Admin页面里面,将PeekpaUser加入进去。

添加完了之后,我们启动程序。并且来到http://127.0.0.1:8000/admin/页面,通过超级管理员账号登录进来:

002

看到这里有三个内容:Tokens, Users和 Groups。

我们这里需要使用到的就是Tokens和Users。

我们可以在回到我们之前写好的Dashboard页面http://127.0.0.1:8000/cms/dashboard/,然后在User里面创建一个新的User:

003

004

我们这里只是为了测试,所以简单一点:账号:[email protected],密码:peekpa。然后点击确定。

创建好之后,我们再回到我们的Admin页面,来看一下发生了什么。首先进入User页面:

005

看到新创建的[email protected]是成功创建出来的;接着我们去看一下Token页面:

006

看到这里,在创建新用户的时候,系统自动生成了一个与之匹配的Token,值为0db104f47f1fec1d4f179a6ca369b691c060848c,并且关联到的User是我们刚刚创建的[email protected]用户。

这里就说明,我们的Token Authentication已经完成了50%了,那么我们接着继续。

使用Token Authentication

既然,我们要使用Token验证,首先第一步就是要拿到Token。

拿到Token有两种方法:

  1. 用Django REST Framework自带的obtain_auth_token方法可以获取;
  2. 就是自己写一个方法,在登录成功的时候,将Token吐给前端出来。

我们这里就先使用第一种方法来给大家展示一下,咱们先把流程都跑通了,再优化。

首先,我们需要将函数路径修改一下,映射到obtain_auth_token方法中,直接修改Peekpa/urls.py文件里面,添加一下代码:

from rest_framework.authtoken.views import obtain_auth_token

urlpatterns = [
    ### ...先前内容过多,省略...
    path('api-auth/', obtain_auth_token)
]

这个obtain_auth_token方法只接受POST请求,需要传入登录账号的参数,即emailpassword这两个。所以我们打开我们的Postman来测试一下:

007

看到,方法是POST,路径是http://127.0.0.1:8000/api-token/,传入两个参数emailpassword,返回结果则是我们的Token,就是之前所生成的对应[email protected]这个账号的token:0db104f47f1fec1d4f179a6ca369b691c060848c

这里如果传入的参数不对,则会返回其他错误信息,这个大家可以下去自行试验一下。

接下来,我们就是要如何使用这个Token了。

我们的试想,是要通过上一节所讲的数据中心异步请求接口,通过传入参数以及Token,来给我们返回结果。那么我们就这么干。

如果想要在视图函数里面使用Token的验证,我们需要稍微修改一下视图函数。上节课我们写的API函数是CenterApiView,对应的URL是center/data/,在没有修改之前,我们的接口http://127.0.0.1:8000/center/data/返回结果是这一个样子:

008

为了融合Token,我们这里就把CenterApiView稍微修改一下:

from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import TokenAuthentication

class CenterApiView(APIView):
    authentication_classes = [TokenAuthentication]
    permission_classes = (IsAuthenticated,)

然后我们来在Postman里面测试一下我们的接口http://127.0.0.1:8000/center/data/,发现返回结果是未授权:

009

但是,如果想要我们的接口通过Token验证,我们就需要在请求HEADER里面添加一个变量:Authorization,他的值是我们刚才的Token。我们这个时候添加了参数再来看一下:

010

要注意这里Authorization的值,是Token再加一个空格,然后再跟值。

如果我们这个时候,把Authorization的值修改一下,将最后的c换乘d,看看返回结果:

011

直接返回的401错误。

关于在视图函数添加权限,我们还可以在Peekpa/settings.py里面添加下面的内容:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

不过这么做的话,就是全局设置了验证类和验证权限了。

这样,我们的Token验证逻辑就完全跑通了。接下来,我们就能够通过这种方式来给前后端分离做准备了,即VUE前端的每次请求,都可以携带Token来获取数据。

当然,这里的验证,并不仅仅只是Token这种方式,还有其他很多种,这里皮爷仅仅只是抛砖引玉,为大家打开一个思路。

目前,peekpa.com的代码,我已经在Github和码云上面共享了,每一篇文章都配有源码。接下来的内容,将会是重磅的前后端分离,前端Vue开发,后端Django开发。

技术总结

最后总结一下,

Django REST framework实现Token验证:

  1. setting.py文件里面的INSTALLED_APPS里添加rest_framework.authtoken;
  2. 加了INSTALLED_APPS之后,需要执行python manage.py makemigrationspython manage.py
  3. 修改User模型,在创建用户的时候,通过Token.objects.create(user=instance)创建一个和User相关联的Token;
  4. 在需要使用Token验证的视图函数中,添加authentication_classespermission_classes;
  5. 进阶篇的Django Token验证总结完毕。

获取整套教程源码唯一途径,关注『皮爷撸码』,回复『peekpa.com』

长按下图二维码关注,如文章对你有启发或者能够帮助到你,欢迎点赞在看转发三连走一发,这是对我原创内容输出的最大肯定。

你可能感兴趣的:(用Django全栈开发(进阶篇)——11. Django REST framework实现Token验证)