用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

我们这里只是为了测试,所以简单一点:账号:pylm@peekpa.com,密码:peekpa。然后点击确定。

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

005

看到新创建的pylm@peekpa.com是成功创建出来的;接着我们去看一下Token页面:

006

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

这里就说明,我们的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,就是之前所生成的对应pylm@peekpa.com这个账号的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』

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342