目錄
- 一、Token基本概念及原理
- 1、Token作用
- 2、什么是Token
- 3、Token運(yùn)行原理
- 4、Token認(rèn)證優(yōu)點(diǎn)
- 5、Token和 Cookie、Session 的選型
- 二、Token實(shí)戰(zhàn)
在之前的Python接口自動(dòng)化測試系列文章:Python接口自動(dòng)化之cookie、session應(yīng)用詳解,介紹了cookie、session原理及在自動(dòng)化過程中如何利用cookie、session保持會(huì)話狀態(tài)。
以下介紹Token原理及在自動(dòng)化中的應(yīng)用。
一、Token基本概念及原理
1、Token作用
為了驗(yàn)證用戶登錄情況以及減輕服務(wù)器的壓力,減少頻繁的查詢數(shù)據(jù)庫,使服務(wù)器更加健壯。
2、什么是Token
Token是服務(wù)端生成的一串字符串,以作客戶端進(jìn)行請(qǐng)求的一個(gè)令牌,當(dāng)?shù)谝淮蔚卿浐?,服?wù)器生成一個(gè)Token便將此Token返回給客戶端,以后客戶端只需帶上這個(gè)Token前來請(qǐng)求數(shù)據(jù)即可,無需再次帶上用戶名和密碼。
3、Token運(yùn)行原理
1.當(dāng)用戶首次登錄成功之后, 服務(wù)器端就會(huì)生成一個(gè) token 值,這個(gè)值會(huì)在服務(wù)器保存token值(保存在數(shù)據(jù)庫中),再將這個(gè)token值返回給客戶端;
2.客戶端拿到 token 值之后,進(jìn)行保存 (保存位置由服務(wù)器端設(shè)置);
3.以后客戶端再次發(fā)送網(wǎng)絡(luò)請(qǐng)求(一般不是登錄請(qǐng)求)的時(shí)候,就會(huì)將這個(gè) token 值附帶到參數(shù)中發(fā)送給服務(wù)器;
4.服務(wù)器接收到客戶端的請(qǐng)求之后,會(huì)取出token值與保存在本地(數(shù)據(jù)庫)中的token值進(jìn)行比較;
5.如果兩個(gè) token 值相同, 說明用戶登錄成功過,當(dāng)前用戶處于登錄狀態(tài);
6.如果沒有這個(gè) token 值, 沒有登錄成功;
7.如果 token 值不同,說明原來的登錄信息已經(jīng)失效,讓用戶重新登錄;
4、Token認(rèn)證優(yōu)點(diǎn)
無狀態(tài)(也稱:服務(wù)端可擴(kuò)展行):Token機(jī)制在服務(wù)端不需要存儲(chǔ)session信息,因?yàn)門oken 自身包含了所有登錄用戶的信息,只需要在客戶端的cookie或本地介質(zhì)存儲(chǔ)狀態(tài)信息.
可重用性:在多個(gè)平臺(tái)和域(domains)上運(yùn)行,重復(fù)使用相同的令牌來驗(yàn)證用戶,很容易構(gòu)建與其他應(yīng)用程序共享權(quán)限的應(yīng)用程序。
安全性:由于我們沒有使用 Cookies,我們不必再防御網(wǎng)站的跨站點(diǎn)請(qǐng)求偽造(CSRF)攻擊。
5、Token和 Cookie、Session 的選型
對(duì)于只需要登錄用戶并訪問存儲(chǔ)在站點(diǎn)數(shù)據(jù)庫中的一些信息的中小型網(wǎng)站來說,Session Cookies 通常就能滿足。如果有企業(yè)級(jí)站點(diǎn),應(yīng)用程序或附近的站點(diǎn),并且需要處理大量的請(qǐng)求,尤其是第三方或很多第三方(包括位于不同域的API),則 token顯然更適合。
二、Token實(shí)戰(zhàn)
講了那么多概念和原理,很多小伙伴可能不知道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)
響應(yīng)結(jié)果如下:
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InZpdmkiLCJleHAiOjE1ODY4NDg5NzgsImVtYWlsIjoidml2aUBxcS5jb20ifQ.a2ExtNVjGrY8T1gefcJTnk4JUOx9NVtCk6lMK8o47co",
"user_id": 1,
"username": "vivi"
}
響應(yīng)結(jié)果有返回token,但是token要怎么用呢,不急,我們一步步來。
假設(shè)現(xiàn)在有個(gè)項(xiàng)目列表的接口,在不登錄的前提下,不能訪問。
import requests
url = 'http://127.0.0.1:8000/projects/'
pro_res = requests.get(url)
print(pro_res.json())
響應(yīng)結(jié)果:提供認(rèn)證信息
{'detail': '身份認(rèn)證信息未提供。'}
項(xiàng)目列表接口需要攜帶token,服務(wù)器校驗(yàn)成功后,才能成功返回信息
重點(diǎn)來了,如何從登錄接口獲取token,項(xiàng)目列表接口又如何攜帶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)
# 從響應(yīng)結(jié)果中獲取token值
token = login_res.json()["token"]
print("token:", token)
響應(yīng)結(jié)果為:
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InZpdmkiLCJleHAiOjE1ODY4NTEyMjksImVtYWlsIjoidml2aUBxcS5jb20ifQ.neqVM5MFGuFbKIUOCqW_qXBajhTTQMfmAs2PWTkEMes
那項(xiàng)目列表接口又如何攜帶token呢,token直接加在請(qǐng)求頭,這樣就可以了么,當(dāng)然不是,我們還需要在token前加上前綴,前綴由后端設(shè)置,見過最多的前綴是:Bearer,不清楚的參照接口文檔。
項(xiàng)目列表攜帶token訪問。
import requests
url = 'http://127.0.0.1:8000/projects/'
# 拼接最終的token,注意中間有個(gè)空格
token = "Bearer" + " " + token
headers={
"authorization": token
}
pro_res = requests.get(url,headers=headers)
print(pro_res.json())
響應(yīng)結(jié)果為:
{
"count": 2,
"results": [
{
"id": 1,
"name": "自動(dòng)化測試平臺(tái)項(xiàng)目1",
"tester": "vivi"
},
{
"id": 2,
"name": "自動(dòng)化測試平臺(tái)項(xiàng)目2",
"tester": "coco"
}
],
"total_pages": 1,
"current_page_num": 1
}
到此這篇關(guān)于Python接口自動(dòng)化之淺析requests模塊post請(qǐng)求的文章就介紹到這了,更多相關(guān)Python接口自動(dòng)化equests模塊post請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- python+unittest+requests實(shí)現(xiàn)接口自動(dòng)化的方法
- python http接口自動(dòng)化腳本詳解
- 一個(gè)Python最簡單的接口自動(dòng)化框架
- Python接口自動(dòng)化之淺析requests模塊get請(qǐng)求