簡介
為了驗證用戶登錄情況以及減輕服務器的壓力,減少頻繁的查詢數據庫,使服務器更加健壯。有些登錄不是用 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的使用稍有差異,這里不做詳細說明。