Workers 反向代理实现 WebDAV

254 天前
 chuyiyue

大佬们有办法用 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 });
  }
}

1403 次点击
所在节点    Cloudflare
4 条回复
chinni
254 天前
用 rclone 完事
shinession
254 天前
alist 可以
xiadd
254 天前
用 alist 吧,worker 的限制怕是搞不了这种服务,要是小文件多了,可能分分钟超过限制
ysc3839
254 天前
如果 WebDAV 客户端支持下载 302 跳转后的文件,那是比较好实现的,不然反向代理流量可能会比较慢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1032221

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX