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

原文地址

简介

上一篇我们介绍了如何搭建一个后台,并且提供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下添加如下代码:

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

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

测试API

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

image.png

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

image.png

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

其他平台测试

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

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

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

http://127.0.0.1:8000/auth/

image.png

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

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

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

Postman测试

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

我们先用POST来访问API试试

image.png

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

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

利用POST访问链接获取token

http://127.0.0.1:8000/auth/

image.png

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

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

image.png

Authorization : JWT + 你获取到的token

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

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

image.png

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

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

image.png

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

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();

这篇暂且到这里了。

有时间我会继续更新其他内容。

谢谢大家。

猜你喜欢

转载自blog.csdn.net/weixin_40193776/article/details/81212886