基于 Python實現(xiàn)云服務(wù)器的CDN域名遠(yuǎn)程鑒權(quán)配置
實戰(zhàn)場景
在項目實戰(zhàn)中,會碰到一種特定的運(yùn)維場景,對CDN訪問進(jìn)行限制,一般手段是開啟 referer 防盜鏈,開啟 IP黑白名單,開啟UA黑白名單,本篇博客為大家展示的是通過我們自己的服務(wù)器,然后實現(xiàn)遠(yuǎn)程鑒權(quán),進(jìn)行更加細(xì)致的權(quán)限判定。
實現(xiàn)目標(biāo):
- 請求CDN資源調(diào)用我們的鑒權(quán)服務(wù)器
- 鑒權(quán)服務(wù)器獲取請求信息,并保存到日志中
- 分別返回鑒權(quán)成功,鑒權(quán)失敗
開啟遠(yuǎn)程鑒權(quán)
在遠(yuǎn)程鑒權(quán)頁面打開【開關(guān)】之后,出現(xiàn)如下配置界面,這里相關(guān)細(xì)節(jié)描述如下:
鑒權(quán)服務(wù)器地址
:我們自己的服務(wù)器,地址可訪問,可以是域名也可以是IP地址;請求方法
:支持 GET,POST,HEAD 三種請求;鑒權(quán)文件類型
:多個文件類型用|
分隔,例如mp4|flv
;保留參數(shù)設(shè)置
:控制用戶請求 URL 中需要鑒權(quán)的參數(shù),用|
分隔;自定義參數(shù)
:可以自定義參數(shù),可以使用CDN控制臺預(yù)設(shè)的變量,多個參數(shù)用|
分隔,例如token=$arg_token|vendor=ali_cdn
;保留請求頭設(shè)置
:控制用戶請求頭中需要鑒權(quán)的參數(shù),可以保留所有參數(shù),也可以保留指定參數(shù);添加自定義參數(shù)
:給請求頭添加自定義參數(shù);鑒權(quán)狀態(tài)碼
:成功200,失敗 403;鑒權(quán)超時時長
:單位為毫秒,最長時長可以設(shè)置為3000;
參考上述說明配置完畢,得到如下界面,本案例中僅限制了 m3u8
類型的文件,后續(xù)我們根據(jù)實際情況進(jìn)行修改。
開啟該配置之后,再次訪問靜態(tài)資源,就會出現(xiàn) 403 Forbidden
這里需要注意,由于測試的是 m3u8 文件,所以訪問該文件的時候,如果沒有被禁止,會自動下載。
Python 端權(quán)限驗證
以下代碼基于 Flask 編寫,主要將POST請求數(shù)據(jù)和Header請求頭保存到文件中。 日志文件,我們使用 logging 模塊寫入到 new.log
文件中。
# 導(dǎo)入Flask類 from flask import Flask from flask import request from flask import render_template import logging import requests import time import random import base64 logging.basicConfig(level=logging.DEBUG, filename='./new.log', filemode='a', format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s') # 實例化,可視為固定格式 app = Flask(__name__) @app.route('/auth', methods=['GET', 'POST','HEAD']) def auth(): if request.method == 'GET': args = request.args return "hello" if request.method == 'HEAD': print("HEAD請求") arges = request.form print("參數(shù)") logging.info(arges) print(request) print("請求頭") headers = request.headers print(headers) logging.info(headers) print("請求數(shù)據(jù)") logging.info(request.data) return "login success", 200 # 403 if request.method == "POST": print("POST請求") arges = request.form print(request) headers = request.headers print("參數(shù)") logging.info(arges) print("請求頭") logging.info(headers) print("請求數(shù)據(jù)") logging.info(request.data) return "login success", 200 # 403 if __name__ == '__main__': # app.run(host, port, debug, options) # 默認(rèn)值:host="127.0.0.1", port=5000, debug=False app.run(host="0.0.0.0", port=5000)
此時,當(dāng)你再次訪問CDN資源時,會自動回調(diào)你的服務(wù)器進(jìn)行鑒權(quán)操作,上述代碼請求成功之后,返回狀態(tài)碼為 200,接下來CDN資源可以訪問,如果返回403,表示被禁用。
驗證邏輯
服務(wù)端驗證可以基于 referer + ua + ip 進(jìn)行驗證,為了保證效率,可以使用 redis 緩存數(shù)據(jù)庫進(jìn)行配置。
到此這篇關(guān)于基于 Python實現(xiàn)云服務(wù)器的CDN域名遠(yuǎn)程鑒權(quán)配置的文章就介紹到這了,更多相關(guān)CDN 鑒權(quán)配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python列表插入append(), extend(), insert()用法詳解
在本篇文章里小編給大家整理了關(guān)于python列表插入append(), extend(), insert()用法以及相關(guān)知識點(diǎn),有需要的朋友們參考下。2019-09-09python里使用正則的findall函數(shù)的實例詳解
這篇文章主要介紹了python里使用正則的findall函數(shù)的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10利用Python進(jìn)行圖像的加法,圖像混合(附代碼)
這篇文章主要介紹了利用Python進(jìn)行圖像的加法,圖像混合(附代碼),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python+SeaTable實現(xiàn)生成條形碼圖片并寫入表格
不管是錄入信息時需要用掃碼器掃碼錄入,還是有別的生成條形碼的需要,這在?SeaTable?表格中用?Python?腳本就可以輕松實現(xiàn),本文就來為大家詳細(xì)講解一下2022-07-07python報錯TypeError: Input z must be
大家好,本篇文章主要講的是python報錯TypeError: Input z must be 2D, not 3D的解決方法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2021-12-12用Python刪除本地目錄下某一時間點(diǎn)之前創(chuàng)建的所有文件的實例
下面小編就為大家分享一篇用Python刪除本地目錄下某一時間點(diǎn)之前創(chuàng)建的所有文件的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12