Cloudflare Worker 重定向剥离身份验证标头

Ada*_*dam 2 cloudflare cloudflare-workers

我设置了一个 Cloudflare Worker 来重定向到我们的 API 网关,因为我们无法控制 DNS,也不能只设置 CNAME。重定向有效,它会传递正文和授权之外的所有标头。它收到它,当我查看工作控制台时,它会将其列为已编辑。它还编辑了我传递的 user_key 参数,但它传递了它。

const base = 'https://myurl.com'
const statusCode = 308;

addEventListener("fetch", event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const url = new URL(request.url);
  const { pathname, search } = url;

  const destinationURL = base + pathname + search;

  return Response.redirect(destinationURL, statusCode);
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*rda 6

首先,请注意,您看到的修订纯粹是为了在工作人员控制台中显示。这是一项保护敏感机密不被记录的功能,但它不会影响任何实时请求的内容。

现在,关于您的 Worker 实际在做什么:

该工作人员向客户端返回 308 重定向响应。然后由客户端来遵循重定向,将相同的请求发送到新的 URL。

那么,由客户端决定是否将Authorization标头发送到新位置——该行为不受 Cloudflare Workers 控制。事实证明,许多客户端Authorization在重定向到不同域名时故意删除标头。例如,Go HTTP 客户端库就是这样做的,node-fetch 最近也开始这样做。(我碰巧不同意这一改变,原因我在评论中解释过。)

如果客户端是网络浏览器,则行为会很复杂。如果Authorization标头作为 HTTP 基本身份验证的一部分添加到请求中(即浏览器提示用户输入用户名和密码),则在执行重定向时标头将被删除。但是,如果Authorization标头是由客户端 JavaScript 代码在调用 时提供的fetch(),则标头将通过重定向保留。

解决此问题的最佳方法可能是:不要使用 3xx 重定向。相反,让 Worker 直接将请求转发到新 URL。也就是说,代替这个:

  return Response.redirect(destinationURL, statusCode);
Run Code Online (Sandbox Code Playgroud)

尝试这个:

  return fetch(destinationURL, request);
Run Code Online (Sandbox Code Playgroud)

使用此代码,客户端将不会收到重定向。相反,Worker 会直接将请求转发到新的 URL,然后将响应转发回客户端。在这种情况下,Worker 充当中间人代理。从客户端的角度来看,没有发生任何转发,原始 URL 只是处理了请求。