1. 程式人生 > 其它 >介面測試-Token登陸(十三)

介面測試-Token登陸(十三)

為了驗證使用者登入情況以及減輕伺服器的壓力,減少頻繁的查詢資料庫,使伺服器更加健壯。有些登入不是用 cookie 來驗證的,是用 token 引數來判斷是否登入。token 傳參有兩種一種是放在請求頭裡,本質上是跟 cookie 是一樣的,只

是換個單詞而已;另外一種是在 url 請求引數裡,這種更直觀。

登入返回token

1、如下圖的這個登入介面,就是沒有 cookies的登入介面。

 

2、但是這個登入介面,登入成功後有返回token,如下圖

請求頭帶token

1、登入成功後繼續操作其它頁面,發現post請求的請求頭,都會帶有token引數

 

2、這種請求其實比cookie更簡單,直接把登入後的token放到頭部即可

token關聯

1、用指令碼實現登入,獲取token引數,獲取後傳參到請求頭就可以了

2、如果登入有驗證碼,前面的指令碼登入步驟就省略了,自己手動登入後獲取token

參考程式碼

 1 # coding:utf-8
 2 import requests
 3 header = {   # 登入抓包獲取的頭部
 4         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
 5         "Accept": "*/*",
 6         "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
 7         "Accept-Encoding": "gzip, deflate",
 8         "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
 9         "X-Requested-With": "XMLHttpRequest",
10         "Content-Length": "423",
11         "Connection": "keep-alive"
12         }
13 body = {"key1": "value1",
14         "key2": "value2"}  # 這裡賬號密碼就是抓包的資料
15 s = requests.session()
16 login_url = "http://xxx.login"   # 自己找帶token網址
17 login_ret = s.post(login_url, headers=header, data=body)
18 # 這裡token在返回的json裡,可以直接提取
19 token = login_ret.json()["token"]
20 # 這是登入後發的一個post請求
21 post_url = "http://xxx"
22 # 新增token到請求頭
23 header["token"] = token
24 # 如果這個post請求的頭部其它引數變了,也可以直接更新
25 header["Content-Length"]="9"
26 body1 = {
27          "key": "value"
28          }
29 post_ret = s.post(post_url, headers=header, data=body1)
30 print post_ret.content

小結

Token的意義及用法

一.Token的來源:

       當客戶端多次向服務端請求資料時,服務端就需要多次從資料庫中查詢使用者名稱和密碼並進行對比,判斷使用者名稱和密碼是否正確,並作出相應提示。但這樣無疑會增加伺服器端的執行壓力,是否可以有一種方式只需要驗證使用者就是之前的用

戶而不需要每次在客戶端請求資料時都需要查詢資料庫判斷使用者名稱和密碼是否正確。在這種請求下,引入了token來解決伺服器端多次訪問資料庫問題。

1、什麼是Token: 

       Token是服務端端生成的一串字串,作為客戶端進行請求時辨別客戶身份的的一個令牌。當用戶第一次登入後,伺服器生成一個Token便將此Token返回給客戶端,以後客戶端只需帶上這個Token前來請求資料即可,無需再次帶上使用者名稱和密碼。

2、使用Token的目的: 

Token的目的是為了驗證使用者登入情況以及減輕伺服器的壓力,減少頻繁的查詢資料庫,使伺服器更加健壯。

二. Token的運用流程:

1、當用戶首次登入成功之後, 伺服器端就會生成一個 token 值,這個值,會在伺服器儲存token值(儲存在資料庫中),再將這個token值返回給客戶端;

2、客戶端拿到 token 值之後,進行儲存 (儲存位置由伺服器端設定);

3、以後客戶端再次傳送網路請求(一般不是登入請求)的時候,就會將這個 token 值附帶到引數中傳送給伺服器.;

4、伺服器接收到客戶端的請求之後,會取出token值與儲存在本地(資料庫)中的token值進行比較;

5、如果兩個 token 值相同, 說明使用者登入成功過!當前使用者處於登入狀態;

6、如果沒有這個 token 值, 沒有登入成功;

7、如果 token 值不同: 說明原來的登入資訊已經失效,讓使用者重新登入;

8、Django Rest framework中JWT的使用稍有差異,這裡不做詳細說明。