python搭建oss下载链接中转代理验证服务笔记
具体架构如下:

Referer 验证:检查 HTTP 请求头中的 Referer。如果不匹配设定的允许域名,则拒绝访问。
安全参数校验:如果请求中携带了时间戳 t 和签名 token,系统会校验该时间戳是否过期,并重新计算 MD5 签名以验证数据完整性。
本地缓存与 OSS 读取:检查本地存储目录是否存在请求的文件。如果存在,直接返回本地文件。
?如果不存在,使用阿里云 OSS SDK 下载文件到本地,然后再返回给客户端。
1、服务端python
import os
import time
import hashlib
from urllib.parse import urlparse
from fastapi import FastAPI, Request, HTTPException, status
from fastapi.responses import FileResponse
import oss2
app = FastAPI()
# --- 配置项 ---
# 1. 阿里云 OSS 配置
OSS_ACCESS_KEY_ID = ""
OSS_ACCESS_KEY_SECRET = ""
OSS_ENDPOINT = "https://oss-cn-beijing.aliyuncs.com" # 根据实际区域填写
OSS_BUCKET_NAME = ""
# 2. 安全与验证配置
SECRET_KEY = "您的安全密钥_KeepItSecret" # 用于与PHP端一致的MD5签名
ALLOWED_REFERERS = ["localhost", "www.example.com"] # 允许的Referer域名列表
# 3. 本地存储配置
LOCAL_STORAGE_DIR = "./local_cache" # 本地缓存目录
os.makedirs(LOCAL_STORAGE_DIR, exist_ok=True)
# 初始化 OSS 客户端
auth = oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)
bucket = oss2.Bucket(auth, OSS_ENDPOINT, OSS_BUCKET_NAME)
def verify_referer(request: Request) -> bool:
"""验证 Referer 是否合法"""
referer = request.headers.get("referer")
if not referer:
# 如果需要严格限制必须有 Referer,可以返回 False
return False
try:
parsed_uri = urlparse(referer)
domain = parsed_uri.netloc.split(':')[0] # 去除端口号
return domain in ALLOWED_REFERERS
except Exception:
return False
def verify_token(file_path: str, t: str, token: str) -> bool:
"""验证时间戳与签名是否合法"""
if not t or not token:
return False
try:
expire_time = int(t)
except ValueError:
return False
# 1. 验证是否过期
current_time = int(time.time())
if current_time > expire_time:
return False # 已过期
# 2. 验证签名是否匹配 (算...点击查看剩余70%
网友评论