測試開發基礎,教你做一個完整功能的Web平臺之登入認證

博為峰網校發表於2022-07-12

回顧

在上篇文章《手把手教你做測開:開發Web平臺之環境準備》中,我們做了以下幾件事情: 加我VX:atstudy-js 回覆“測試”,進入 自動化測試學習交流群~~

1. 搭建了前後端專案工程

2. 安裝了前後端的依賴

3. 配置並啟動了前後端服務

4. 建立了後端子應用

5. 將Rest Framework和資料庫連線資訊配置進後端的配置檔案中

也許你已經蠢蠢欲動準備寫程式碼了,看到這裡恭喜你,我們馬上進入程式碼環節。在這篇文章中,我們將完成以下功能的實戰:

1. 後端登入認證的實現

2. 前後端服務關聯配置

3. 前端登入邏輯的梳理

4. 前端登入邏輯的修改

5. 跨域問題的解決

後端登入認證的實現

說到Web端的認證機制,作為測試人員,我們能想到的是cookie、session、token。那麼Django中也為我們提供了一些jwt(Json Web Token)認證的方式。

有djangorestframework-jwt、djangorestframework-simplejwt等依賴庫,由於前者已經不維護了,我們本次使用後者(官方文件:)。

jwt安裝與配置

可以使用pip install djangorestframework-simplejwt來安裝,但我們之前已經安裝過了。

在後端配置檔案settings.py中配置。這裡需要注意,simplejwt為我們提供了兩個token,一個是access token,一個是refresh token。

ACCESSTOKENLIFETIME是access token的過期時間,配置為5分鐘,REFRESHTOKENLIFETIME是refresh token的過期時間,預設為1天。

當access token失效時,refresh token會自動獲取一個新的access token,使得使用者保持在登入態,直到refresh toke過期,使用者再做重新登入。否則access token一旦失效,使用者就要重新登入體驗會比較差。

from datetime import timedelta

REST_FRAMEWORK = {

'DEFAULT_AUTHENTICATION_CLASSES': (

'rest_framework_simplejwt.authentication.JWTAuthentication',

)

}

SIMPLE_JWT = {

'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),

'REFRESH_TOKEN_LIFETIME': timedelta(days=1),

'ROTATE_REFRESH_TOKENS': False,

'BLACKLIST_AFTER_ROTATION': False,

'UPDATE_LAST_LOGIN': False,

'ALGORITHM': 'HS256',

'SIGNING_KEY': SECRET_KEY,

'VERIFYING_KEY': None,

'AUDIENCE': None,

'ISSUER': None,

'JWK_URL': None,

'LEEWAY': 0,

'AUTH_HEADER_TYPES': ('Bearer',),

'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',

'USER_ID_FIELD': 'id',

'USER_ID_CLAIM': 'user_id'

}

(二). user_auth序列化器

1.我們從simplejwt的官網可以看到,它為我們提供了一些自定義token的方法。

2.為什麼我們要自定義返回token?因為如果直接使用,我們可能得到的登入返回結果是類似這樣的:

data: {

'access': 'xxxxxxxx',

'refresh': 'xxxxxxx' }

3.一個登入請求的響應結果,我們肯定希望有code、message,包括user_id,因此我們需要在userauth子應用下建立一個序列化器檔案serializer.py。

4.在這個檔案中,我們建立了一個MyTokenObtainPairSerializer類,這個類繼承了TokenObtainPairSerializer類,然後重寫了父類的gettoken和validate方法。我們給校驗後的返回資料加上了code、message、user_id等欄位。

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):

@classmethod

def get_token(cls, user):

token = super().get_token(user)

return token

def validate(self, attrs):

data = super().validate(attrs)

re_data = {'data': data, 'code': 200, 'message': 'success', 'user_id': self.user.id}

return re_data

(三). user檢視

1.在user_auth子應用下的views.py中定義一個MyTokenObtainPairView的檢視類,它繼承了TokenObtainPairView,指定它的序列化器為我們自定義的序列化器MyTokenObtainPairSerializer。

from rest_framework_simplejwt.views import TokenObtainPairView

from .serializer import MyTokenObtainPairSerializer

class MyTokenObtainPairView(TokenObtainPairView):

serializer_class = MyTokenObtainPairSerializer

2.請求方法不需要自己定義,MyTokenObtainPairView的父類的父類 TokenViewBase中定義了一個post方法,這個是最終返回給我們登入後的token及其他資訊的介面。

(四). user路由

1.序列化器、檢視類都定義完成後,下一步需要看看路由,記得在上篇文章中,我們在user_auth子應用下新建了一個urls.py檔案,這個檔案裡就用來存放子應用的路由資訊。

將子路由的訪問路徑設定為 user/login。

from django.urls import path, include

from rest_framework.routers import DefaultRouter

from .views import MyTokenObtainPairView

router = DefaultRouter()

urlpatterns = [

path('', include(router.urls)), path('user/login', MyTokenObtainPairView.as_view(), name='token_obtain_pair'), ]

2.子應用的路由設定好後,需要去父路由backend/urls.py中設定子路由的資訊。這樣最終的一個訪問路徑將是:。

from django.contrib import admin

from django.urls import path, include

urlpatterns = [

path('admin/', admin.site.urls), path('', include('user_auth.urls'))

]

(五). user資料表遷移

1.很多人看到這裡不禁要問,User模型類是不是還沒定義。事實上,django為我們自帶了User模型類,它的路徑是django.contrib.auth.models.User,因此需要對自帶的User模型類做資料遷移。

最後:

可以到我的個人V:atstudy-js,可以免費領取一份10G軟體測試工程師面試寶典文件資料。以及相對應的視訊學習教程免費分享!其中包括了有基礎知識、Linux必備、Mysql資料庫、抓包工具、介面測試工具、測試進階-Python程式設計、Web自動化測試、APP自動化測試、介面自動化測試、測試高階持續整合、測試架構開發測試框架、效能測試等。

這些測試資料,對於做【軟體測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31407649/viewspace-2905413/,如需轉載,請註明出處,否則將追究法律責任。

相關文章