如何让Swagger文档在外部API认证后可用且不暴露swagger.json
解决方案:Swagger文档需认证访问且保护swagger.json
结合你的架构情况(Cloudfront第三方认证、reitit-swagger不可修改),可以通过以下几种方式实现需求:
方案1:Cloudfront路径行为区分(最直接,无需代码修改)
利用Cloudfront的行为规则优先级,针对不同Swagger路径设置差异化认证策略:
- 创建两个Cloudfront行为:
- 具体路径行为:匹配
/swagger.json,开启API认证规则,拒绝未认证请求访问该文件。 - 通配符路径行为:匹配
/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;
- 放行Swagger UI的静态资源(如
- 示例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
相关产品推荐
相关产品推荐

