You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Swagger文档在外部API认证后可用且不暴露swagger.json

解决方案:Swagger文档需认证访问且保护swagger.json

结合你的架构情况(Cloudfront第三方认证、reitit-swagger不可修改),可以通过以下几种方式实现需求:

方案1:Cloudfront路径行为区分(最直接,无需代码修改)

利用Cloudfront的行为规则优先级,针对不同Swagger路径设置差异化认证策略:

  • 创建两个Cloudfront行为:
    1. 具体路径行为:匹配/swagger.json,开启API认证规则,拒绝未认证请求访问该文件。
    2. 通配符路径行为:匹配/swagger*(注意优先级低于前者),设置为跳过认证,允许公开访问Swagger UI的静态资源(HTML、CSS、JS等)。
  • 关键:Cloudfront会优先匹配更具体的路径规则,所以/swagger.json的认证规则会覆盖通配符的跳过规则,确保只有认证用户能获取API细节,而普通用户可以看到Swagger UI界面但无法加载核心文档。

方案2:Cloudfront函数/Lambda@Edge动态拦截

如果路径匹配无法满足更复杂的场景,可以用Cloudfront的轻量函数(或Lambda@Edge)在请求阶段做动态判断:

  • 核心逻辑:
    • 放行Swagger UI的静态资源(如/swagger-ui/下的所有非json文件),无需认证;
    • 对/swagger.json的请求强制校验认证头,未通过则返回401;
  • 示例Cloudfront函数伪代码:
function handler(event) {
  const req = event.request;
  const uri = req.uri;

  // 允许Swagger UI静态资源公开访问
  if (uri.startsWith('/swagger-ui/') && !uri.endsWith('swagger.json')) {
    return req;
  }

  // 拦截swagger.json请求,校验认证
  if (uri.endsWith('swagger.json')) {
    const authHeader = req.headers.authorization;
    if (!authHeader) {
      return {
        statusCode: 401,
        statusDescription: 'Unauthorized',
        headers: { 'www-authenticate': { value: 'Bearer' } }
      };
    }
    // 这里可集成你的第三方认证库逻辑完成校验
    return req;
  }

  return req;
}

方案3:后端代理路由配合(需少量配置调整)

如果可以调整Swagger UI的文档加载路径(无需修改reitit-swagger核心代码),可以这么做:

  • 在后端新增一个受保护的路由(如/api/protected/swagger.json),该路由需通过API认证,内部转发请求到原/swagger.json;
  • 配置reitit-swagger生成的UI,使其加载/api/protected/swagger.json而非原路径;
  • 在Cloudfront设置:拒绝所有直接访问/swagger.json的请求(返回403),同时为/api/protected/swagger.json开启认证规则。

优先级推荐

优先选方案1,因为纯Cloudfront配置操作,无需改动任何代码,完全适配你无法修改reitit-swagger的场景;若需要更灵活的访问控制,再考虑方案2;方案3适合允许微调Swagger UI配置的场景。

内容的提问来源于stack exchange,提问作者laalaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:22:43