Неверный "URL-адрес сгенерированного сервера" в springdoc-openapi-ui (пользовательский интерфейс Swagger), развернутый за прокси

Приложение Spring Boot 2.2 с springdoc-openapi-ui (пользовательский интерфейс Swagger) запускает HTTP-порт. Приложение развертывается в Kubernetes с Ingress-маршрутизацией HTTPS-запросов извне кластера к службе.

В этом случае пользовательский интерфейс Swagger доступен по адресу https://example.com/api/swagger-ui.html неверный "URL сгенерированного сервера" - http://example.com/api. Хотя должно бытьhttps://example.com/api.

Хотя доступ к пользовательскому интерфейсу Swagger осуществляется по HTTPS, сгенерированный URL-адрес сервера по-прежнему использует HTTP.

6 ответов

Решение

springdoc-openapiВ FAQ есть раздел Как я могу развернуть Doployspringdoc-openapi-ui, за обратным прокси?.

Раздел FAQ может быть расширен.

Убедитесь, что заголовки X-Forwarded отправляются вашим прокси-сервером (X-Forwarded-For, X-Forwarded-Proto и другие).

Если вы используете Undertow (spring-boot-starter-undertow), установить свойство server.forward-headers-strategy=NATIVEчтобы веб-сервер изначально обрабатывал заголовки X-Forwarded. Также подумайте о переходе на Undertow, если вы его не используете.

Если вы используете Tomcat (spring-boot-starter-tomcat), установить свойство server.forward-headers-strategy=NATIVE и обязательно укажите IP-адреса всех внутренних прокси, которым можно доверять. server.tomcat.internal-proxies=192\\.168\\.\\d{1,3}\\.\\d{1,3}. По умолчанию доверенные IP-адреса в 10/8, 192.168/16, 169.254/16 и 127/8.

В качестве альтернативы для Tomcat установите свойство server.forward-headers-strategy=FRAMEWORK.

Полезные ссылки:

У меня была такая же проблема. Ниже работал у меня.

      @OpenAPIDefinition( 
    servers = {
       @Server(url = "/", description = "Default Server URL")
    }
) 
@SpringBootApplication
public class App {
// ...
}

Если принятое решение не работает для вас, вы всегда можете установить URL-адрес вручную, определив bean-компонент.

      @Bean
public OpenAPI customOpenAPI() {
    Server server = new Server();
    server.setUrl("https://example.com/api");
    return new OpenAPI().servers(List.of(server));
}

И URL-адрес может быть определен через свойство и введен сюда.

Если у вас есть контекстный путь не по умолчанию

      @Configuration
public class SwaggerConfig {
    
    @Bean
    public OpenAPI openAPI(ServletContext servletContext) {
        Server server = new Server().url(servletContext.getContextPath());
        return new OpenAPI()
                .servers(List.of(server))
                // ...
    }
}

Установите значение по умолчанию «/», используя аннотацию @Server. Это заставит API-интерфейсы Swagger использоватьhttps

      import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.servers.Server;

@OpenAPIDefinition(servers = {@Server(url = "/", description = "Default Server URL")})
public class FormService implements ApplicationRunner {
....
}

Ниже сработало для меня.

      @OpenAPIDefinition(servers = {@server(url = "/", description = "Default Server URL")})
@SpringBootApplication
class App{
// ...
}

или же

      @OpenAPIDefinition(servers = {@server(url = "/", description = "Default Server URL")})
@Configuration
public class OpenAPIConfig {
@Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("App name")
                        .termsOfService("http://swagger.io/terms/")
                        .license(new License().name("Apache 2.0").url("http://springdoc.org")));
    }
}

Сгенерированный URL-адрес сервера — HHTP — проблема

Другие вопросы по тегам