那麼這就需要使用者提供一些資訊,比如使用者名稱密碼等,但是為了安全起見讓使用者暴露的明文密碼次數越少越好,我們一般在web專案中,大多數採用儲存的session中,
對於敏感的api介面,需使用https協議
https是在http超文字傳輸協議加入ssl層,它在網路間通訊是加密的,所以需要加密證書。https協議需要ca證書,一般需要交費。
使用者登入後向伺服器提供使用者認證資訊(如賬戶和密碼),伺服器認證完後給客戶端返回乙個pid令牌,使用者再次獲取資訊時,
① 時間戳:timestamp② pid令牌:pid(在這我們給定義為pid)
然後將所有使用者請求的引數(包括timestamp,pid),然後更具md5加密(可以加點鹽),生成動態的url。
然後登陸後每次呼叫使用者資訊時,帶上timestamp,pid引數。
加上時間戳和pid後的url:
就變成乙個動態的而且相對的具有高安全的,保證資料安全的訪問。
1. api請求客戶端想伺服器端一次傳送用使用者認證資訊(使用者名稱和密碼),伺服器端請求到改請求後,驗證使用者資訊是否正確。
如果正確:則返回乙個唯一不重複的字串,然後在redis(任意快取伺服器)中維護這個使用者資訊關係,以便其他api對pid的校驗。
如果錯誤:則返回錯誤碼。
2.伺服器設計乙個url請求攔截規則
①判斷是否包含timestamp,pid引數,如果不含有返回錯誤碼。②根據使用者請求的url引數,伺服器端按照同樣的規則生成動態的url,對比請求的動態url與服務端生成的是否相等,相等則放行允許訪問。
③判斷伺服器接到請求的時間和引數中的時間戳是否相差很長一段時間(時間自定義如十秒),如果超過則說明該url已經過期。
④記錄下每次請求的動態url,規定乙個動態的url只能訪問一次,檢測每次請求的url是否請求過,去過存在就返回錯誤**(處理url被攔截並且在十秒內請求的訪問)。
⑤此url攔截只需對獲取身份認證的url放行(如登陸url),剩餘所有的url都需攔截。
3.定期處理儲存下來的動態請求url
服務端規定的規則
#!/usr/bin/env python# -*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
import hashlib
import time
access_record = # 建立第一次登入過url列表
pid_list = [ # pid列表
'qwe',
'ioui',
'234s',
]class mainhandler(tornado.web.requesthandler):
def get(self):
# 獲取url中全部資料
pid = self.get_argument('pid', none)
# 獲取變數
m5, client_time, i = pid.split('|') # 獲得資料,以「|」分割開
print(m5, client_time, i)
server_time = time.time() # 服務端的當前時間
# 時間超過10s禁止
if server_time > float(client_time) + 10: # 服務端的當前時間大於客戶端當前時間加10秒,表示過期不允許訪問
self.write('gun')
return
# 處理10s內容重複的請求
if pid in access_record: # 如果客戶端請求的動態url在第一次登入過的url列表中
self.write('gun')
return
pid = pid_list[int(i)] # 獲得客戶端發來的pid後面攜帶的數字
ramdom_str = "%s|%s" % (pid, client_time) # 把客戶的pid與當前時間戳拼接
h = hashlib.md5() # md5加密值
h.update(bytes(ramdom_str, encoding='utf-8')) # 把客戶的pid與當前時間戳拼接乙個字串再盡心md5加密
server_m5 = h.hexdigest() # 服務端生成的動態url
# print(m5,server_m5)
if m5 == server_m5: # 客戶生成的與服務端生成的進行對比
self.write("hello, world")
else:
self.write('gun')
(r"/index", mainhandler),
])if __name__ == "__main__":
tornado.ioloop.ioloop.instance().start()
客戶端按規則生成符合的
#!/usr/bin/env python# -*- coding:utf-8 -*-
import time
import requests
import hashlib
pid = 'qwe' # 客戶的pid
current_time = time.time() # 當前時間戳
ramdom_str = "%s|%s" % (pid, current_time) # 把pid與當前時間戳拼接成乙個字串
h = hashlib.md5() # md5加密
h.update(bytes(ramdom_str, encoding='utf-8')) # 把pid與當前時間戳拼接成乙個字串再進行md5加密
uid = h.hexdigest() # 加密後的字串
q = "%s|%s|0" % (uid, current_time) # 在把這個字串後面拼接乙個數值 0
url = '' % q # 生成最後生成的動態url
print(url)
ret = requests.get(url)
print(ret.text)
測試效果**
#!/usr/bin/env python# -*- coding:utf-8 -*-
import requests
ret = requests.get('')
print(ret.text)
這是比較粗超的api認證機制,可以初步了解。
zhuan :
開放介面API安全性
開放介面時最基本需要考慮到介面不應該被別人隨意訪問,而我也不能隨意訪問到其他使用者的資料,從而保證使用者與使用者之間的資料隔離。這個時候我們就有必要引入token機制了。具體的做法 在使用者成功登入時,系統可以返回客戶端乙個token,後續客戶端呼叫服務端的介面,都需要帶上token,而服務端需要校...
API介面安全性設計
介面的安全性主要圍繞token timestamp和sign三個機制展開設計,保證介面的資料不會被篡改和重複呼叫,下面具體來看 token授權機制 使用者使用使用者名稱密碼登入後伺服器給客戶端返回乙個token 通常是uuid 並將token userid以鍵值對的形式存放在快取伺服器中。服務端接收...
API介面安全性設計
介面的安全性主要圍繞token timestamp和sign三個機制展開設計,保證介面的資料不會被篡改和重複呼叫,下面具體來看 token授權機制 使用者使用使用者名稱密碼登入後伺服器給客戶端返回乙個token 通常是uuid 並將token userid以鍵值對的形式存放在快取伺服器中。服務端接收...