日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

API验证

發布時間:2025/3/17 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 API验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

API驗證

在web應用中,服務端提供的API接口必須有某種安全機制,來識別Http請求是否合法,以防別有用心之人截獲http請求,對服務端進行攻擊的行為。這里,參考Tornado簽名cookie源碼,來實現一個API驗證的功能。

基本思路:

  • 服務端給有權限訪問的客戶端發放key,客戶端每次訪問時攜帶key給服務端進行驗證。
  • 為了防止請求被截獲后key泄露,將key與當前時間進行加密后生成動態密鑰。
  • 請求被截獲后,不法分子依然能夠直接使用這個動態密鑰通過服務端的驗證。因此服務端增加有效期驗證,比如5S超時,超過這個時間的請求無法通過驗證。
  • 如果不法分子截獲請求,并在超時前訪問API,還是有風險。因此服務端增加第一次訪問驗證,同樣密鑰如果是第二次請求,無法通過。

  • 下面我們在Django中實踐一下:

  • 新建項目API_AUTH,創建應用app01,定義路由如下:

    from django.conf.urls import url from app01 import viewsurlpatterns = [url(r'^api_auth/$', views.api_auth), ]

  • 寫一個腳本test.py,通過request模塊對上述路由發起Http請求

    import requests, time, hashlibkey = 'asdgasgewfqsef' url = 'http://127.0.0.1:8000/server.html'# 將key與當前時間加密生成動態密鑰tokentimestamp = time.time() temp = '{key}|{time}'.format(key=key,time=timestamp) md5_str = hashlib.md5(temp.encode('utf-8')).hexdigest() token = '{md5_str}|{time}'.format(md5_str=md5_str, time=timestamp)# 在Http請求頭中攜帶tokenresponse = requests.get(url, headers={"auth-key": token}) print(response.text)# 模擬超時發送請求fake = token time.sleep(6) response = requests.get(url, headers={'auth-key': fake}) print('second...',response.text)

    說明:

  • 通過headers={key: value}發送自定義請求頭

  • 服務端api_auth視圖函數:

    def api_auth(request, *args, **kwargs):key = 'asdgasgewfqsef' # 服務端與客戶端持有同樣的keytemp_key = {# client_md5: timestamp --> 過期自動清除, 判斷是第一次請求# 通過redis,Memcache來做過期自動清除}token = request.META.get('HTTP_AUTH_KEY') # 提取請求頭中的密鑰print('token...',token)# 6e632f8e858e07ffcc3b636a1577121b|1506983215.7659595# 分割出客戶端動態key和時間字符串client_md5 = token.split('|')[0]timestamp = token.split('|')[1]# 用客戶端的時間字符串和服務端的key,生成服務端動態keytemp = '{key}|{time}'.format(key=key, time=timestamp)server_md5 = hashlib.md5(temp.encode('utf-8')).hexdigest()now = time.time()if float(timestamp) + 5 < now: # 5s過期驗證return HttpResponse('呵呵')elif server_md5 != client_md5: # 動態key驗證return HttpResponse('呵呵')elif temp_key[client_md5]: # 第一次訪問驗證return HttpResponse('呵呵')else: # 驗證通過,將這次的請求的動態key和時間戳作為記錄保存,以作下次第一次訪問驗證。temp_key[client_md5] = timestamp return HttpResponse('驗證通過')

    說明:

  • 自定義請求頭的信息從request.META中獲取;
  • 請求頭中的'auth-key'會被轉化為HTTP_AUTH_KEY
  • temp_key中的記錄后期通過redis,Memcache來做過期自動清除, 參考AES加密

  • 封裝成裝飾器,可以給需要的視圖函數使用

    def api_auth(func):def deco(request, *args, **kwargs):key = 'asdgasgewfqsef' # 服務端與客戶端持有同樣的key# 同上......now = time.time()if float(timestamp) + 5 < now: # 5s過期驗證return HttpResponse('呵呵')elif server_md5 != client_md5: # 動態key驗證return HttpResponse('呵呵')elif temp_key[client_md5]: # 第一次訪問驗證return HttpResponse('呵呵')else: # 驗證通過,將這次的請求的動態key和時間戳作為記錄保存,以作下次第一次訪問驗證。temp_key[client_md5] = timestampreturn func(request, *args, **kwargs)return deco@api_auth def view_func():pass
  • 總結

    以上是生活随笔為你收集整理的API验证的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。