Springboot, CXF 3.2.7, Swagger2Feature: заголовок авторизации не отображается в заголовках запроса - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь интегрировать Swagger 2 в мой API, который реализован с использованием новейшей версии CXF: 3.2.7.

Я перепробовал множество учебников, официальную документацию CXF , другие тоже (например, Spring Boot, Apache CXF, Swagger под JAX-RS ). Официальный сайт чванства мне не помогает. Swagger OpenAPI 2.0 doc не работает, сосед OpenAPI 3.0 .

Он не работает со схемами компонентов Open API 3.0.0, поэтому я остановился на apiKeyDefinition.

Тот, который сейчас работает, можно найти в этой теме в ответе @Naoj: CXF Swagger2Feature добавление безопасности Определения

С этим решением появился пользовательский интерфейс swagger, а также кнопка Autorize. enter image description here

Я заполняю форму аутентификации и после этого пытаюсь отправлять запросы с помощью swagger-ui. Проблема в том, что заголовок Authorization не появляется в запросе, поэтому я получил 401 ответ.


В помпе:

<dependency>    
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-rs-service-description-swagger</artifactId>
    <version>3.2.7</version>
</dependency>
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>swagger-ui</artifactId>
    <version>3.20.1</version>
</dependency>

Моя конфигурация выглядит так:

@Configuration
public class SwaggerConfig {

    @Bean
    @ConfigurationProperties("swagger")
    public Swagger2Feature swagger() {
        return new ExtendedSwagger2Feature();
    }

    @Bean
    @DependsOn("jaxRsServer")
    public ServletContextInitializer initializer() {
        return servletContext -> {
            BeanConfig scanner = (BeanConfig) ScannerFactory.getScanner();
            Swagger swagger = scanner.getSwagger();
            servletContext.setAttribute("swagger", swagger);
        };
    }
}

Расширенные функции чванства следующие:

@Provider(value = Provider.Type.Feature, scope = Provider.Scope.Server)
public class ExtendedSwagger2Feature extends Swagger2Feature {

    @Override
    protected void addSwaggerResource(Server server, Bus bus) {
        super.addSwaggerResource(server, bus);

        BeanConfig config = (BeanConfig) ScannerFactory.getScanner();
        Swagger swagger = config.getSwagger();
        swagger.securityDefinition("Bearer", new ApiKeyAuthDefinition("authorization", In.HEADER));
    }
}

Я пытаюсь настроить аутентификацию на основе токенов Bearer JWT. Мой application.yml содержит следующее:

swagger:
   basePath: /rest
   title: Backend Application
   description: Swagger documentation of Backend Application REST services
   license:
   licenceUrl:
   contact:
   resourcePackage: my.resource.package
   scan: true
   apiKeyAuthDefinition:
     name: Authorization
     in: header
     type: http

Я импортирую SwaggerConfig в мой класс @SpringBootApplication так:

@Import(SwaggerConfig.class)

Работает, как я вижу, появился чванец, и поле заголовка и описания заполнено свойствами моего yml.

Что мне не хватает? Любые предложения будут оценены. Заранее спасибо.

1 Ответ

0 голосов
/ 15 января 2019

Вы можете упростить свой код и удалить ExtendedSwagger2Feature и initializer(). Измените метод swagger() следующим образом, и результат будет таким же:

@Bean
@ConfigurationProperties("swagger")
public Swagger2Feature swagger() {
    Swagger2Feature swagger2Feature = new Swagger2Feature();
    swagger2Feature.setSecurityDefinitions(Collections.singletonMap("bearerAuth",
            new ApiKeyAuthDefinition("Authorization", In.HEADER)));
    return swagger2Feature;
}

Причина, по которой токен не был добавлен в ваш запрос, заключается в том, что securityDefinitions является просто декларацией для доступных схем. Вам необходимо применить его к операции, добавив (к вашему интерфейсу TestResource):

@Api( authorizations = @Authorization( value = "bearerAuth" ))

Вы увидите значок блокировки рядом с операцией в интерфейсе Swagger. В настоящее время его там нет.

Btw. Вы должны использовать более новый OpenApiFeature вместо старого Swagger2Feature. С удовольствием отвечу на вопросы, если у вас возникли проблемы с этим.

...