Неверный "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")));
}
}