Подтвердить что ты не робот

Интерфейс Swagger UI, передающий токен аутентификации для вызова API в заголовке

Я новичок в Swagger.

Я использую пользовательский интерфейс Swagger для создания документации swagger. У меня есть два вызова API. Первый вызов заключается в создании токена на основе имени пользователя и пароля. Второй токен вызова требует первого вызова.

Как я установил этот токен для второго вызова с использованием интерфейса Swagger?

4b9b3361

Ответ 1

@ApiImplicitParams и @ApiImplicitParam должны сделать @ApiImplicitParam дело:

@GET
@Produces("application/json")
@ApiImplicitParams({
    @ApiImplicitParam(name = "Authorization", value = "Authorization token", 
                      required = true, dataType = "string", paramType = "header") })
public String getUser(@PathParam("username") String userName) {
    ...
}

Из документации:

Вы можете пожелать описать параметры работы вручную. Это может быть по разным причинам, например:

  • Использование сервлетов, которые не используют аннотации JAX-RS.
  • Желание скрыть параметр, как он определен, и переопределить его совершенно другим определением.
  • Опишите параметр, который используется фильтром или другим ресурсом до достижения реализации JAX-RS.

Пользовательский интерфейс Swagger будет обновлен, и вы сможете отправлять свой токен оттуда. Никаких изменений в HTML не потребуется.


Примечание. Некоторое время назад, документируя REST API с помощью Swagger, я понял, что простого добавления @ApiImplicitParam недостаточно (даже если у вас есть только один параметр).В любом случае, вы также должны добавить @ApiImplicitParams.

Ответ 2

Это старый вопрос, но именно так я решил его недавно с версией 2.7.0 для моих токенов JWT

В вашей конфигурации swagger добавьте ниже SecurityConfiguration bean. Важная часть оставляет пятый аргумент пустым или нулевым.

@Bean
    public SecurityConfiguration securityInfo() {
        return new SecurityConfiguration(null, null, null, null, "", ApiKeyVehicle.HEADER,"Authorization","");
    }

Добавьте securitySchemes(Lists.newArrayList(apiKey())) к основному Docket bean.

@Bean
    public Docket docket()
    {
        return new Docket(DocumentationType.SWAGGER_2).select()
            .....build().apiInfo(...).securitySchemes(Lists.newArrayList(apiKey()));
    }


    private ApiKey apiKey() {
        return new ApiKey("Authorization", "Authorization", "header");
    } 

Затем в UI вам нужно щелкнуть по кнопке Авторизация и ввести "Bearer access_token" (для текстового поля "Авторизация" ), где access_token - это токен, предоставляемый сервером токенов jWT.

Как только эта авторизация будет сохранена, это вступит в силу для всех конечных точек. Добавление отдельного текстового поля для каждой конечной точки выглядит очень громоздким.

Ответ 3

Вам нужно будет настроить страницу индексации swagger, чтобы добиться того, что я считаю.

Вы можете сделать ввод "input_apiKey" скрытым и добавить два входа для имени пользователя и пароля. Затем вы делаете ajax-вызов для обновления скрытого ввода с помощью токена.

Ответ 4

Моя конфигурация для версии 2.9.2 Swagger для добавления авторизации в интерфейсе Swagger и отправки токена на предъявителя

        @Bean
        public Docket api(ServletContext servletContext) {
          return new Docket(DocumentationType.SWAGGER_2)...
               .securitySchemes(Arrays.asList(apiKey()))
                .securityContexts(Collections.singletonList(securityContext()));
        }

        private SecurityContext securityContext() {
          return SecurityContext.builder().securityReferences(defaultAuth()).forPaths(PathSelectors.regex("/.*")).build();
        }

      private List<SecurityReference> defaultAuth() {
        final AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        final AuthorizationScope[] authorizationScopes = new AuthorizationScope[]{authorizationScope};
        return Collections.singletonList(new SecurityReference("Bearer", authorizationScopes));
      }

      private ApiKey apiKey() {
        return new ApiKey("Bearer", "Authorization", "header");
      } 

Ответ 5

Есть взлом, который может работать с использованием responseInterceptor и requestInterceptor

Сначала перехватите ответ на первый вызов API с использованием responseInterceptor и сохраните токен (в примере в локальном хранилище), затем используйте requestInterceptor чтобы добавить заголовок Authorization с сохраненным токеном.

            const ui = SwaggerUIBundle({
               ...
                responseInterceptor:
                    function (response) {
                        if (response.obj.access_token) {
                            console.log(response.obj.access_token)
                            const token = response.obj.access_token;
                            localStorage.setItem("token", token)
                        }

                        return response;
                    },
                requestInterceptor:
                    function (request) {
                        console.log('[Swagger] intercept try-it-out request');
                        request.headers.Authorization = "Bearer " + localStorage.getItem("token");
                        return request;
                }
           }