Python接口自動化之Token詳解及應用


在上一篇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封裝,比較重要,離最終的框架又進了一步。

 

更多系列文章,可以關注微信公眾號:ITester軟件測試小棧


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM