基于 Python實(shí)現(xiàn)云服務(wù)器的CDN域名遠(yuǎn)程鑒權(quán)配置
實(shí)戰(zhàn)場(chǎng)景
在項(xiàng)目實(shí)戰(zhàn)中,會(huì)碰到一種特定的運(yùn)維場(chǎng)景,對(duì)CDN訪問(wèn)進(jìn)行限制,一般手段是開(kāi)啟 referer 防盜鏈,開(kāi)啟 IP黑白名單,開(kāi)啟UA黑白名單,本篇博客為大家展示的是通過(guò)我們自己的服務(wù)器,然后實(shí)現(xiàn)遠(yuǎn)程鑒權(quán),進(jìn)行更加細(xì)致的權(quán)限判定。
實(shí)現(xiàn)目標(biāo):
- 請(qǐng)求CDN資源調(diào)用我們的鑒權(quán)服務(wù)器
- 鑒權(quán)服務(wù)器獲取請(qǐng)求信息,并保存到日志中
- 分別返回鑒權(quán)成功,鑒權(quán)失敗
開(kāi)啟遠(yuǎn)程鑒權(quán)
在遠(yuǎn)程鑒權(quán)頁(yè)面打開(kāi)【開(kāi)關(guān)】之后,出現(xiàn)如下配置界面,這里相關(guān)細(xì)節(jié)描述如下:
鑒權(quán)服務(wù)器地址
:我們自己的服務(wù)器,地址可訪問(wèn),可以是域名也可以是IP地址;請(qǐng)求方法
:支持 GET,POST,HEAD 三種請(qǐng)求;鑒權(quán)文件類型
:多個(gè)文件類型用|
分隔,例如mp4|flv
;保留參數(shù)設(shè)置
:控制用戶請(qǐng)求 URL 中需要鑒權(quán)的參數(shù),用|
分隔;自定義參數(shù)
:可以自定義參數(shù),可以使用CDN控制臺(tái)預(yù)設(shè)的變量,多個(gè)參數(shù)用|
分隔,例如token=$arg_token|vendor=ali_cdn
;保留請(qǐng)求頭設(shè)置
:控制用戶請(qǐng)求頭中需要鑒權(quán)的參數(shù),可以保留所有參數(shù),也可以保留指定參數(shù);添加自定義參數(shù)
:給請(qǐng)求頭添加自定義參數(shù);鑒權(quán)狀態(tài)碼
:成功200,失敗 403;鑒權(quán)超時(shí)時(shí)長(zhǎng)
:?jiǎn)挝粸楹撩?,最長(zhǎng)時(shí)長(zhǎng)可以設(shè)置為3000;
參考上述說(shuō)明配置完畢,得到如下界面,本案例中僅限制了 m3u8
類型的文件,后續(xù)我們根據(jù)實(shí)際情況進(jìn)行修改。
開(kāi)啟該配置之后,再次訪問(wèn)靜態(tài)資源,就會(huì)出現(xiàn) 403 Forbidden
這里需要注意,由于測(cè)試的是 m3u8 文件,所以訪問(wèn)該文件的時(shí)候,如果沒(méi)有被禁止,會(huì)自動(dòng)下載。
Python 端權(quán)限驗(yàn)證
以下代碼基于 Flask 編寫(xiě),主要將POST請(qǐng)求數(shù)據(jù)和Header請(qǐng)求頭保存到文件中。 日志文件,我們使用 logging 模塊寫(xiě)入到 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') # 實(shí)例化,可視為固定格式 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請(qǐng)求") arges = request.form print("參數(shù)") logging.info(arges) print(request) print("請(qǐng)求頭") headers = request.headers print(headers) logging.info(headers) print("請(qǐng)求數(shù)據(jù)") logging.info(request.data) return "login success", 200 # 403 if request.method == "POST": print("POST請(qǐng)求") arges = request.form print(request) headers = request.headers print("參數(shù)") logging.info(arges) print("請(qǐng)求頭") logging.info(headers) print("請(qǐng)求數(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)
此時(shí),當(dāng)你再次訪問(wèn)CDN資源時(shí),會(huì)自動(dòng)回調(diào)你的服務(wù)器進(jìn)行鑒權(quán)操作,上述代碼請(qǐng)求成功之后,返回狀態(tài)碼為 200,接下來(lái)CDN資源可以訪問(wèn),如果返回403,表示被禁用。
驗(yàn)證邏輯
服務(wù)端驗(yàn)證可以基于 referer + ua + ip 進(jìn)行驗(yàn)證,為了保證效率,可以使用 redis 緩存數(shù)據(jù)庫(kù)進(jìn)行配置。
到此這篇關(guān)于基于 Python實(shí)現(xiàn)云服務(wù)器的CDN域名遠(yuǎn)程鑒權(quán)配置的文章就介紹到這了,更多相關(guān)CDN 鑒權(quán)配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)動(dòng)態(tài)權(quán)限問(wèn)題
- 鑒權(quán)認(rèn)證+aop+注解+過(guò)濾feign請(qǐng)求的實(shí)例
- 使用Feign設(shè)置Token鑒權(quán)調(diào)用接口
- springCloud gateWay 統(tǒng)一鑒權(quán)的實(shí)現(xiàn)代碼
- SpringCloud中Gateway實(shí)現(xiàn)鑒權(quán)的方法
- shenyu怎么處理sign鑒權(quán)前置到網(wǎng)關(guān)
相關(guān)文章
基于python元祖與字典與集合的粗淺認(rèn)識(shí)
下面小編就為大家?guī)?lái)一篇基于python元祖與字典與集合的粗淺認(rèn)識(shí)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08python列表插入append(), extend(), insert()用法詳解
在本篇文章里小編給大家整理了關(guān)于python列表插入append(), extend(), insert()用法以及相關(guān)知識(shí)點(diǎn),有需要的朋友們參考下。2019-09-09python里使用正則的findall函數(shù)的實(shí)例詳解
這篇文章主要介紹了python里使用正則的findall函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10利用Python進(jìn)行圖像的加法,圖像混合(附代碼)
這篇文章主要介紹了利用Python進(jìn)行圖像的加法,圖像混合(附代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python+SeaTable實(shí)現(xiàn)生成條形碼圖片并寫(xiě)入表格
不管是錄入信息時(shí)需要用掃碼器掃碼錄入,還是有別的生成條形碼的需要,這在?SeaTable?表格中用?Python?腳本就可以輕松實(shí)現(xiàn),本文就來(lái)為大家詳細(xì)講解一下2022-07-07如何用Python做一個(gè)微信機(jī)器人自動(dòng)拉群
這篇文章主要介紹了如何用Python做一個(gè)微信機(jī)器人自動(dòng)拉群,微當(dāng)群人數(shù)達(dá)到100人后,用戶無(wú)法再通過(guò)掃描群二維碼加入,只能讓用戶先添加群內(nèi)聯(lián)系人微信,再由聯(lián)系人把用戶拉進(jìn)來(lái)。這樣,聯(lián)系人員的私人微信會(huì)添加大量陌生人,給其帶來(lái)不必要的打擾,需要的朋友可以參考下2019-07-07python報(bào)錯(cuò)TypeError: Input z must be
大家好,本篇文章主要講的是python報(bào)錯(cuò)TypeError: Input z must be 2D, not 3D的解決方法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2021-12-12用Python刪除本地目錄下某一時(shí)間點(diǎn)之前創(chuàng)建的所有文件的實(shí)例
下面小編就為大家分享一篇用Python刪除本地目錄下某一時(shí)間點(diǎn)之前創(chuàng)建的所有文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12