在上一篇Python接口自動化測試系列文章:Python接口自動化之cookie、session應用,介紹了cookie、session原理及在自動化過程中如何利用cookie、session保持會話狀态。
以下介紹Token原理及在自動化中的應用。
一
Token基本概念及原理
1
Token作用
為了驗證使用者登入情況以及減輕伺服器的壓力,減少頻繁的查詢資料庫,使伺服器更加健壯。

2
什麼是Token
Token是服務端生成的一串字元串,以作用戶端進行請求的一個令牌,當第一次登入後,伺服器生成一個Token便将此Token傳回給用戶端,以後用戶端隻需帶上這個Token前來請求資料即可,無需再次帶上使用者名和密碼。
3
Token運作原理
1.當使用者首次登入成功之後, 伺服器端就會生成一個 token 值,這個值會在伺服器儲存token值(儲存在資料庫中),再将這個token值傳回給用戶端;
2.用戶端拿到 token 值之後,進行儲存 (儲存位置由伺服器端設定);
3.以後用戶端再次發送網絡請求(一般不是登入請求)的時候,就會将這個 token 值附帶到參數中發送給伺服器;
4.伺服器接收到用戶端的請求之後,會取出token值與儲存在本地(資料庫)中的token值進行比較;
5.如果兩個 token 值相同, 說明使用者登入成功過,目前使用者處于登入狀态;
6.如果沒有這個 token 值, 沒有登入成功;
7.如果 token 值不同,說明原來的登入資訊已經失效,讓使用者重新登入;
4
Token認證優點
- 無狀态(也稱:服務端可擴充行):Token機制在服務端不需要存儲session資訊,因為Token 自身包含了所有登入使用者的資訊,隻需要在用戶端的cookie或本地媒體存儲狀态資訊.
- 可重用性:在多個平台和域(domains)上運作,重複使用相同的令牌來驗證使用者,很容易建構與其他應用程式共享權限的應用程式。
- 安全性:由于我們沒有使用 Cookies,我們不必再防禦網站的跨站點請求僞造(CSRF)攻擊。
5
Token和 Cookie、Session 的選型
對于隻需要登入使用者并通路存儲在站點資料庫中的一些資訊的中小型網站來說,Session Cookies 通常就能滿足。如果有企業級站點,應用程式或附近的站點,并且需要處理大量的請求,尤其是第三方或很多第三方(包括位于不同域的API),則 token顯然更适合。
二
Token實戰
講了那麼多概念和原理,很多小夥伴可能不知道token長啥樣,接下來以接口登入為例。
import requests
url = 'http://127.0.0.1:8000/user/login/'
payload = {
"username":"vivi",
"password":"123456"
}
res = requests.post(url,json=payload)
print(res.text)
複制
響應結果如下:
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InZpdmkiLCJleHAiOjE1ODY4NDg5NzgsImVtYWlsIjoidml2aUBxcS5jb20ifQ.a2ExtNVjGrY8T1gefcJTnk4JUOx9NVtCk6lMK8o47co",
"user_id": 1,
"username": "vivi"
}
複制
複制
響應結果有傳回token,但是token要怎麼用呢,不急,我們一步步來。假設現在有個項目清單的接口,在不登入的前提下,不能通路。
import requests
url = 'http://127.0.0.1:8000/projects/'
pro_res = requests.get(url)
print(pro_res.json())
複制
響應結果:提供認證資訊
{'detail': '身份認證資訊未提供。'}
複制
項目清單接口需要攜帶token,伺服器校驗成功後,才能成功傳回資訊
重點來了,如何從登入接口擷取token,項目清單接口又如何攜帶token?
通路登入接口,并擷取token。
import requests
url = 'http://127.0.0.1:8000/user/login/'
payload = {
"username":"vivi",
"password":"123456"
}
login_res = requests.post(url,json=payload)
# 從響應結果中擷取token值
token = login_res.json()["token"]
print("token:", token)
複制
複制
響應結果為:
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InZpdmkiLCJleHAiOjE1ODY4NTEyMjksImVtYWlsIjoidml2aUBxcS5jb20ifQ.neqVM5MFGuFbKIUOCqW_qXBajhTTQMfmAs2PWTkEMes
複制
那項目清單接口又如何攜帶token呢,token直接加在請求頭,這樣就可以了麼,當然不是,我們還需要在token前加上字首,字首由後端設定,見過最多的字首是:Bearer,不清楚的參照接口文檔。
項目清單攜帶token通路。
import requests
url = 'http://127.0.0.1:8000/projects/'
# 拼接最終的token,注意中間有個空格
token = "Bearer" + " " + token
headers={
"authorization": token
}
pro_res = requests.get(url,headers=headers)
print(pro_res.json())
複制
複制
響應結果為:
{
"count": 2,
"results": [
{
"id": 1,
"name": "自動化測試平台項目1",
"tester": "vivi"
},
{
"id": 2,
"name": "自動化測試平台項目2",
"tester": "coco"
}
],
"total_pages": 1,
"current_page_num": 1
}
複制
總結:本文主要介紹token基本概念、運作原理及在自動化中接口如何攜帶token進行通路。
下一篇:requests封裝,比較重要,離最終的架構又進了一步。