如果你在公网上部署了一个(Docker)服务,但由于该服务本身缺乏身份验证机制,直接将这类服务暴露在公网上存在严重的安全风险。这时候你可以使用 Cloudflare Worker 为任何 HTTP 服务轻松添加 Basic Auth 鉴权保护。

Basic Auth 是 HTTP 协议中最简单的身份验证方式,它要求用户在访问受保护资源时提供用户名和密码凭证。虽然不应将其用于高度敏感的数据(因为它仅使用 Base64 编码,而非加密),但对于保护非关键性服务和防止随机扫描非常有效。

适用场景

  • 保护暂未提供身份验证的内部工具(如个人正使用的 yt-dlp-webui,firebrowser, firefox等)
  • 限制对开发/测试环境的访问
  • 为静态网站添加简单访问控制
  • 在服务原生认证系统之上添加额外安全层

实现步骤

1. 前提准备

首先确保你拥有:

  • 一个 Cloudflare 账户
  • 已部署的服务(通过穿透或公网 IP 访问)的url,其域名已通过Cloudflare托管

2. 创建 Cloudflare Worker

登录 Cloudflare 控制台,进入 "Workers" 部分,创建一个新 worker。

3. 编写鉴权代码

将以下代码复制到 Worker 编辑器中:

export default {
  async fetch(request, env) {
    // 从环境变量获取用户名和密码
    const USER = env.USERNAME;
    const PASS = env.PASSWORD;

    // 如果环境变量未配置,直接返回错误
    if (!USER || !PASS) {
      return new Response("Server misconfiguration: missing credentials.", {
        status: 500,
        headers: {
          "Content-Type": "text/plain; charset=utf-8",
        },
      });
    }

    // 获取 Authorization 头
    const auth = request.headers.get("Authorization");
  
    // 如果没有认证信息,要求客户端提供凭证
    if (!auth || !auth.startsWith("Basic ")) {
      return new Response("Authentication required.", {
        status: 401,
        headers: {
          "WWW-Authenticate": 'Basic realm="Secure Area"',
          "Content-Type": "text/plain; charset=utf-8",
        },
      });
    }

    try {
      // 解码凭证
      const [, b64] = auth.split(" ");
      const [user, pass] = atob(b64).split(":");

      // 校验凭证
      if (user === USER && pass === PASS) {
        // 移除 Authorization 头,避免转发到后端服务
        const newHeaders = new Headers(request.headers);
        newHeaders.delete("Authorization");
      
        // 创建新的请求对象(保留原请求的所有属性)
        const newRequest = new Request(request, {
          headers: newHeaders
        });
      
        // 凭证正确,转发请求到源服务器
        return fetch(newRequest);
      }
    } catch (e) {
      console.error("Authentication error:", e);
    }

    // 凭证无效,拒绝访问
    return new Response("Invalid credentials.", {
      status: 403,
      headers: {
        "WWW-Authenticate": 'Basic realm="Secure Area"',
        "Content-Type": "text/plain; charset=utf-8",
      },
    });
  },
};

4. 配置环境变量

在 Worker 的「设置」中,添加以下环境变量:

  • USERNAME: 你设定的用户名
  • PASSWORD: 你设定的强密码

如果你想让安全性更强,可以设置变量为“秘密”,但是这样你将看不到具体的值。如果你忘记了凭证信息,只能重新部署worker。

点击部署,你已经可以通过访问cloudflare提供的worker.dev 域名网站查看效果了。如果输入错了凭证信息或者未输入,则不会显示目标url的服务,而是显示401 Unauthorized.

5. 配置路由

进入cloudflare上的你的域名板块,在侧边栏找到worker路由,将特定的路径关联上该worker。

进阶玩法

你还可以通过cloudflare worker自带的ip检测工具来封锁或自定义特定地区的相应内容。可以很好的为你的服务器设立保护层。

缺点

  • http baisc auth不支持多账户管理。您可能需要更改worker的逻辑(例如在代码中写死指定凭证,不过安全性有待考量)或修改环境变量的格式。
  • http baisc auth无法方便地实现登出,如果一定要实现该功能,可以采取更改realm的方法来强制浏览器重新弹出登录框,但并不保证所有浏览器都能实现。

标签:无

3 条评论

  1. 2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

  2. 新车首发,新的一年,只带想赚米的人

  3. 做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com

你的评论