V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chuyiyue
V2EX  ›  Cloudflare

Workers 反向代理实现 WebDAV

  •  
  •   chuyiyue · 17 天前 · 753 次点击

    大佬们有办法用 Workers 反向代理 OneDrive ,Dropbox 之类的云盘实现 webdav 吗

    用 GPT 试着写了一点,但是不是很理想

    addEventListener("fetch", event => {
      event.respondWith(handleRequest(event.request));
    });
    
    async function handleRequest(request) {
      // 从环境变量获取用户名和密码
      const username = BASIC_AUTH_USERNAME;
      const password = BASIC_AUTH_PASSWORD;
    
      // 从请求中获取 Authorization 头部
      const authHeader = request.headers.get("Authorization");
    
      if (!authHeader || !isValidAuth(authHeader, username, password)) {
        // 如果没有提供 Authorization 头部或者认证失败,则返回 401 Unauthorized
        return new Response("Unauthorized", {
          status: 401,
          headers: {
            "WWW-Authenticate": 'Basic realm="Secure Area"',
          },
        });
      }
    
      // 认证成功,处理 OneDrive 相关的请求
      return forwardRequestToOneDrive(request);
    }
    
    function isValidAuth(authHeader, username, password) {
      const encoded = authHeader.split(' ')[1]; // 获取 Base64 编码的部分
      const decoded = atob(encoded); // 解码 Base64
      const credentials = decoded.split(':'); // 分割用户名和密码
      return credentials[0] === username && credentials[1] === password;
    }
    
    async function forwardRequestToOneDrive(request) {
      // 从环境变量获取 OneDrive 访问令牌
      const accessToken = ONE_DRIVE_ACCESS_TOKEN;
      const url = new URL(request.url);
      const baseApiUrl = "https://graph.microsoft.com/v1.0/me/drive/root";
      const apiRequestUrl = `${baseApiUrl}/${url.pathname}`;
    
      const init = {
        method: request.method,
        headers: {
          "Authorization": `Bearer ${accessToken}`,
          ...request.headers,
          "Host": undefined, // 删除原始请求中的 Host 头部
        },
        body: request.method !== "GET" ? await request.body : undefined,
      };
    
      try {
        const response = await fetch(apiRequestUrl, init);
        return new Response(response.body, {
          status: response.status,
          statusText: response.statusText,
          headers: response.headers,
        });
      } catch (error) {
        return new Response(error.toString(), { status: 500 });
      }
    }
    
    
    4 条回复    2024-04-13 21:25:29 +08:00
    chinni
        1
    chinni  
       17 天前
    用 rclone 完事
    shinession
        2
    shinession  
       17 天前
    alist 可以
    xiadd
        3
    xiadd  
       17 天前 via Android
    用 alist 吧,worker 的限制怕是搞不了这种服务,要是小文件多了,可能分分钟超过限制
    ysc3839
        4
    ysc3839  
       17 天前 via Android
    如果 WebDAV 客户端支持下载 302 跳转后的文件,那是比较好实现的,不然反向代理流量可能会比较慢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   820 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:12 · PVG 05:12 · LAX 14:12 · JFK 17:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.