Python_16 session、cookie 鑑權

sweet發表於2023-05-08
一、查缺補漏

  1. pprint
    https://www.cnblogs.com/yjybupt/p/10669988.html
    https://www.cnblogs.com/wongbingming/p/12854618.html
  2. 鑑權:
    http://testingpai.com/article/1621929988356
  3. import json
    json.dump() 轉成json
    json.loads() 轉成字串
  4. cookie可以帶各種 可以帶session,session+token,token可以透過set-cookie傳,也可以透過別的請求頭傳,這些都是靈活的,全看後端開發怎麼解析,session一般是隻能透過響應的set-cookie返回,請求的時候再透過cookie欄位帶過去
二、鑑權
  1. session、cookie 鑑權
    a. 使用MD5、RSA(看不懂的字串)加密,建立一個session物件id和cookie存在mysql或者redis(非關係型資料庫)中
    b. cookie是前端的一種快取機制,引數存在快取裡,session是後端生成的
    c. 不知道是什麼鑑權可以去問開發
  2. token 鑑權 解放了快取,不用儲存,每次都要計算,消耗cpu但是不消耗記憶體,cpu比較便宜
    a. 註冊(資料庫儲存使用者名稱和密碼)
    b. 登陸(提交使用者名稱+密碼)
    c. 後端獲取到使用者名稱密碼(進行校驗密碼和使用者名稱是否與資料庫儲存的一致)
    d. 給我令牌(token)
    e. 演演算法生成token(rootAa12345620412010) 生成token和解析token的規則是固定的
    f. 返回給客戶端
    g. 客戶端再次請求介面帶上token
    h. 後端接收到token並解析token(rootAa12345620412010)
    i. 抽取時間戳(20412010)和id10使用者的唯一標識
    j. 透過使用者唯一標識去資料庫找到生成token需要的資料
    k. 再生成一次token(rootAa12345620412010) 時間戳都是使用之前傳遞的時間戳,當再次生成時才換掉
    l. 拿新生成的和你給我的對比 + 時間戳間隔對比
     用當時的時間戳和之前的做對比(間隔多長時間是由後端決定的)判斷token時效是否過期
     m. token一致就返回介面資料
  3. session、cookie 鑑權和token 鑑權的區別
    a. session會消耗記憶體要到庫裡對比,token不消耗記憶體只需要cpu計算
    b. token相對安全,使用RSA非對稱加密,但是token可逆
    c. session會透過儲存一般是不可逆的
  4. 重點
    a. token生成規則(後端決定)
    b. 如何校驗token正確性、如何校驗token有效時間
    c. token替換規則(後端決定)
    d. 用例執行時token失效,直接重新獲取就好,異常捕獲,重新獲取token,pytest可以錯誤重試
    e. 鑑權方式和token有效時間可以問開發
三、requests
  1. 一些概念:
    a. 什麼叫介面
      i. USB:傳資料
      ii. 網際網路:用來傳資料
    b. 介面必要資料
      i. 請求地址: https://openapiv5.ketangpai.com/UserApi/login
      ii. 請求方法:post、get
      iii. 請求資料:
      iv. 響應引數:
    c. 使用:requests支援所有的http請求方式
  2. get請求:requests.get(url=url,params=None,**kwargs)
    a. url:請求地址
    b. params=None:請求引數
    c. **kwargs:其他欄位
    d. 引數放在url後面:直接拼接可一個新的url
      如 url :'http://httpbin.org/get?key1=val1&key2=val2'
    e. 引數使用params關鍵字接收,會自動拼接到url地址後面
    f. ?:表示後面都是查詢引數,key1=val1形式展示,多個引數使用&進行連線
  3. post請求 requests.post(url,data=None,json=None,**kwargs)
    a. url: 請求地址
    b. data=None:請求引數
    data關鍵字:預設form表單'Content-Type': 'application/x-www-form-urlencoded'
    如果設定請求頭headers = {'Content-Type': 'application/json;charset=UTF-8'},就使用設定的方式
    c. json=None:請求引數
    json關鍵字:預設json模式 'Content-Type': 'application/json;charset=UTF-8'
    如果設定請求頭headers = {'Content-Type': 'application/x-www-form-urlencoded'},就使用設定的方式
    d. **kwargs:接收其他欄位
  4. post的引數格式
    a. application/x-www-form-urlencoded
    預設地,表單資料會編碼為 “application/x-www-form-urlencoded”。就是說,在傳送到伺服器之前,所有字元都會進行編碼,空格轉換為 “+” 加號,特殊符號轉換為 ASCII HEX 值。
    窗體資料被編碼為:名稱/值對,這是標準的編碼格式。
    b. application/json
    資料以 JSON 形式進行編碼
    c. multipart/form-data,頭像
    窗體資料被編碼為一條訊息,頁上的每個控制元件對應訊息中的一個部分,上傳附件用到。在使用包含檔案上傳控制元件的表單時,必須使用該值。
    d. text/html
    文字方式的網頁檔案。
    e. text/xml
    文字方式的 XML 檔案,text/xml 忽略 XML 頭所指定編碼格式而預設採用 US-ASCII 編碼。
    f. text/plain
    窗體資料以純文字形式進行編碼,其中不含任何控制元件或格式字元。空格轉換為 “+” 加號,但不對特殊字元編碼。
    g. application/xml
    資料以 XML 形式進行編碼,application/xml 會根據 XML 頭指定的編碼格式來編碼。
三、POST與GET區別
  1. 引數傳遞
    get:放在請求地址後面,查詢資料,向後端獲取資料,傳的是查詢引數(where條件)
    post:放在body裡面,提交引數,OCR引數、圖片、檔案
  2. 引數長度
    get、post引數長度實際上是由後端配置決定,並不是請求本身決定
    get請求會做引數大小的限制:比較小
    post請求也會做引數大小限制:稍微大一些
  3. 安全性
    get引數暴露在瀏覽器地址上
    post放在body裡面,需要抓包才能看見
  4. 冪等性
    a. 處理同一個請求的重複傳送的方式
      get請求查詢一次和查詢N次得到的結果都是一樣 select * from user where id = 100;
      post請求提交資料:註冊,需要做冪等處理 insert into tabel()value();
    b. 金融行業前端防多點(防止併發),後端冪等(請求資料一樣,則只處理一條請求)

相關文章