python测试开发django-60.token登录(TokenAuthentication)

  • 2019 年 10 月 4 日
  • 笔记

前言

现在很多接口项目在登录的时候返回一个token,登录后的拿着这个token去访问访问登录之后的请求。 本篇使用djangorestframework框架写一个登陆的接口,登录成功后返回token。 环境准备: python 3.6 django 2.1.2

TokenAuthentication

django rest framework权限和认证有四种方式:

  • BasicAuthentication 此身份验证方案使用HTTP基本身份验证,根据用户的用户名和密码进行签名。 基本身份验证通常仅适用于测试
  • TokenAuthentication 此身份验证方案使用基于令牌的简单HTTP身份验证方案。 令牌认证适用于客户端 – 服务器设置,例如本机桌面和移动客户端。
  • SessionAuthentication 此身份验证方案使用Django的默认会话后端进行身份验证。 会话身份验证适用于与您的网站在同一会话上下文中运行的AJAX客户端。
  • RemoteUserAuthentication 此身份验证方案允许您将身份验证委派给Web服务器,该服务器设置REMOTE_USER 环境变量。

本篇讲TokenAuthentication这种认证方式,先安装对应的模块

pip install djangorestframework

在setting.py中加入配置参数

INSTALLED_APPS = (      ...      'rest_framework',      'rest_framework.authtoken',  )

添加REST_FRAMEWORK项,rest_framework.authentication.TokenAuthentication上面说的第三种token认证的方式。

REST_FRAMEWORK = {      'DEFAULT_AUTHENTICATION_CLASSES': (          'rest_framework.authentication.BasicAuthentication',          'rest_framework.authentication.SessionAuthentication',          'rest_framework.authentication.TokenAuthentication',  # token认证      )  }

同步数据库,生成authtoken_token表

python manage.py migrate

执行完成后,数据库里面就会多一张authtoken_token表

登录生成token案例

登录可以直接用django自带的User表,所以不需要重新设计表了,登录的账号就是User表的数据,先准备几个登录的账号,比如我的登录账号是test,密码是123456

views.py编辑登录的视图函数

# views.py  from django.shortcuts import render  from django.http import JsonResponse  from django.shortcuts import HttpResponse  from rest_framework.authtoken.models import Token  from django.contrib import auth  from rest_framework.views import APIView    # 作者:上海-悠悠,QQ交流群:750815713    class LoginViewSet(APIView):      '''登录方法'''        def post(self, request, *args, **kwargs):          username = request.data.get('username')          password = request.data.get('password')          user = auth.authenticate(username=username, password=password)          if not user:              return HttpResponse({"code": 0,                                  "msg": "用户名或密码不对!"})          # 删除原有的Token          old_token = Token.objects.filter(user=user)          old_token.delete()          # 创建新的Token          token = Token.objects.create(user=user)          return JsonResponse({"code": 0,                               "msg": "login success!",                               "username": user.username,                               "token": token.key})

urls.py设置访问地址

# urls.py  from apiapp import views  from django.conf.urls import url    # 作者:上海悠悠,QQ交流群:750815713    urlpatterns = [      url(r'^api/v1/login/$', views.LoginViewSet.as_view()),  ]

测试登录获取token

接着测试登录返回token的接口,使用post请求,请求类型Content-Type: application/json

测试结果

登录成功后,token会写入authtoken_token表里面

其它的接口需要登录之后才能访问,也就是token用户认证下篇再讲