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用戶認證下篇再講