QNIT.NET

  • Windows系统
  • 系统硬件
  • Mac系统
  • Linux系统
  • 虚拟系统
  • 编程技术
  1. 首页
  2. 编程技术
  3. 正文

【Python】利用Django搭建REST风格API后台服务(二)关于JWT认证

2019-12-10 1049 0 0

简介

上一篇我们介绍了如何搭建一个后台,并且提供API服务。

显然那太简单了,功能上是远远达不到使用的级别的。一套完整的API还需要扩展非常多的东西才能达到要求。

上个实验只是搭建一个最简单的后台服务。细心的朋友可能会问了,一个api怎么可以被随意的访问和进行增删改查呢?

没错,这篇文档将要分享对后台添加权限认证的办法,让指定的用户才能通过api对后台进行访问和操作。

REST framework JWT

关于JWT这里不多做叙述,网上有更加优秀的介绍和资源,我就不在这班门弄虎了

REST framework JWT是django的一个插件,想了解更多可以阅读官方文档,里面有详细的解释

我们今天只举例比较常用场景来进行举例。

首先安装相应的依赖包

$ pip install djangorestframework-jwt

配置setting.py

打开上一个实验(Student的那个)。我们在setting.py中配置以下的全局设置。根据所需要场景来选择访问的类型。

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        #   设置访问权限为只读
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
        #   设置访问权限为必须是用户
        # 'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}

我们这边举例两个场景,一种是只读模式,在这种模式下,所有的API都可以被“查找”,未登录用户可以作为观察者进行查看。正如某些新闻平台一样,可以查看新闻,但是想发表评论必须登录。

另外一种场景是,用户模式,所有的操作都必须在登录认证后才能进行一系列的操作。正如某些面向内部使用的系统,如仓库系统、教务系统。如果不登录,那信息容易泄露。

大家根据自己的需求来选择。

配置路由地址

在总路由urls.py下添加如下代码:

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('dapi.urls')),  # 添加的路由地址

    path('auth/', obtain_jwt_token),
    path('auth/', include('rest_framework.urls', namespace='rest_framework')),
]

这样一来,路由就配置完成了。我们进行测试。

测试API

现在大家打开之前的API地址测试一下。我这边使用的是只读的方式IsAuthenticatedOrReadOnly进行访问,可以看到视图中,POST、PUT、DELETE等按钮已经消失了。如果你使用的是IsAuthenticated方式下进行访问,得到一串json格式的信息,说你未进行认证,无法访问资源。

现在我们点击视图的右上角,有一个login按钮,点击输入你的后台账号密码即可登陆。登陆成功后会发现所有的权限都开启了。

登陆状态能持续保存是因为登陆时建立了session,如果把上面配置的SessionAuthentication那行去掉,该会话就保持不了

其他平台测试

现在我们成功了给API加上认证权限了,有人估计要问了。我不可能在这个浏览器或者视图上进行API调用吧,我想让移动端或者JavaScript进行调用,怎么样才能获取到权限?

话题回到我们刚刚配置的JWT,相信大家也有去了解了JWT的认证方式和加密手段。

我们用浏览器试着访问刚刚我们配置好的路由试试

http://127.0.0.1:8000/auth/

视图底下会出现一个POST提交请求的对话框,分别是账号和密码。聪明的童鞋马上就知道了,通过这条链接进行POST请求,可以进行认证。那认证完毕后悔返回出什么东西出来呢?如图所示,返回的内容是一个json格式的信息

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InR1bm0iLCJleHAiOjE1MzI1NDM5MjUsImVtYWlsIjoidEBxcS5jb20ifQ.DtY2u-z8DP8HvL3_dv7vq5i_ix36MyIOHTJv423yFVk"
}

没错就是返回了一个token回来,由于其他平台下可能没有session来建立会话,所有我们拿到这个叫做token的东西就是我们访问Api的一个工具,也叫做令牌,带上令牌才可以进门。?

Postman测试

我们利用我们的好朋友Postman来进行测试。

我们先用POST来访问API试试

显然,执行失败了,返回出未认证拒绝操作的信息回来。

这时,我们要先获取到Token,才能进行下一步的操作

利用POST访问链接获取token

http://127.0.0.1:8000/auth/

拿到token后,我们应该怎么使用它呢?先把他的值复制下来

我们在Headers下,构造一条属性

Authorization : JWT + 你获取到的token

这样一来,就可以进行操作了,我们这里添加了一个叫做煞笔啊的学生,显然是成功了

值得一提的是,为了方便测试,Postman有提供更方便的认证工具

我们选择Authorization下的Basic Auth方式来进行认证。

输入账号密码后,会发现刚刚我门刚刚在Headers构造的地方,自动出现了一条Authorization的属性。这样就方便许多了

其他平台访问方式也是大同小异。

Java&Android下访问

在Java环境下我一般使用的是Okhttp3.0。如果需要带token去访问api我一般这样写。request的构造方式如下

final Request request = new Request.Builder()
        .url(url)
        .addHeader("Authorization", "jwt XXXXXXXXXXXXXXXXXXXXXX"  //jwt + token的值
        .post(formBody)  //这里也可以是get、put和delete
        .build();

这篇暂且到这里了。

标签: API Django JWT
最后更新:2021-11-24

leon

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

取消回复
最新 热点 随机
最新 热点 随机
清理 Docker 占用的磁盘空间 CSS常用命名名称 常用正则表达式速查手册,Python文本处理必备 SAS硬盘指示灯状态对照表 电脑的基础认识(硬件篇) 将照片变成漫画风格
远程连接Mysql,报1130错误的解决方法 CentOS7使用Gogs 搭建个人git仓库和项目自动部署 VirtualBox虚拟机后台运行 Mac截图快捷键 快速解决MacOS密码忘记问题 电脑的基础认识(硬件篇)
标签聚合
虚拟系统 JWT API MySql Django Navicat Mojave ESXI

COPYRIGHT © 2021 QNIT.NET. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY Qnit.net

黔ICP备2021010068号

贵公网安备 52270102000278 号