Swagger - 授权对带有文档的 url 的请求

mic*_*son 7 swagger spring-boot openapi springdoc

我想知道 Swagger 中是否有一个选项可以授权对包含外部文档的 url 的请求。

我有以下配置,我感兴趣的是urls[1]部分

springdoc.swagger-ui.urls[0].url=/v3/api-docs
springdoc.swagger-ui.urls[0].name=default
springdoc.swagger-ui.urls[1].url=https://asdasd.blob.core.windows.net/my-api/docs.spec
springdoc.swagger-ui.urls[1].name=additional
Run Code Online (Sandbox Code Playgroud)

我可以从服务器(直接从机器上curl)访问文档,但是从Swagger(因此浏览器)我不能。我想知道是否有一个选项可以添加例如。Authorization Bearer xxxx对此请求或实际上使服务器发出请求,而不是客户端。

为了澄清 -我想从远程服务器获取带有 OpenAPI 定义的第二个文件,所以我正在谈论这个: 在此输入图像描述

不是Authorize部分 在此输入图像描述


我实施的解决方案:

海伦指出的可行 - 拦截请求并添加标头 - 但不幸的是,在我的情况下,还存在与存储的防火墙设置有关的问题。只有来自服务器的流量,而不是客户端(浏览器)通过,所以我:

  1. 将 url 设置为我的域中的某个内容
    springdoc.swagger-ui.urls[1].url=v3/api-docs/additional
  2. 为远程主机的 url 指定另一个属性
    mydomain.swagger-ui.additionalDocsUrl=...
  3. 实现了一个处理该 url 的自定义控制器 - 它作为服务器而不是客户端从远程获取 json,以便防火墙传递该请求
@Hidden
@RestController
@RequestMapping("/v3/api-docs/additional")
@RequiredArgsConstructor
public class AdditionalOpenApiController {

    @Value("${mydomain.swagger-ui.additionalDocsUrl}")
    private String additionalDocsUrl;

    @Cacheable(value = "ADDITIONAL_API_DOCS", unless = "#result != null")
    @GetMapping(produces = "application/json")
    public String getAdditionalDocs() {
        // in my case remote produces application/octet-stream so it needs to be byte[]
        return Optional.ofNullable(new RestTemplate().getForObject(additionalDocsUrl, byte[].class)) 
                .map(String::new)
                .orElseThrow(() -> new ResourceNotFoundException("Cannot load Additional OpenAPI from storage"));
}
Run Code Online (Sandbox Code Playgroud)

bri*_*bro 1

这只能通过编程来实现。

  • 首先:实现您自己的requestInterceptor:请参阅AbstractSwaggerIndexTransformer示例,以编程方式实现您的请求(例如 addCSRF 方法)。
  • 其次实现你自己的MySwaggerIndexPageTransformer并将其定义为 spring bean,它将代替 springdoc 被加载SwaggerIndexPageTransformer在此输入图像描述