python搭建oss下载链接中转代理验证服务笔记

python搭建oss下载链接中转代理验证服务笔记

具体架构如下:

800_auto

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%

{{collectdata}}

网友评论