Spring Boot & Swagger UI. Set JWT token

前端 未结 4 1166
隐瞒了意图╮
隐瞒了意图╮ 2020-12-23 14:57

I have a Swagger config like this

@EnableSwagger2
@Configuration
public class SwaggerConfig {
    @Bean
    public Docket api() {
        List

        
相关标签:
4条回答
  • Support for Authorization: Bearer [JWT_TOKEN] header is working as of version 2.9.2

    Added the following dependencies to build.gradle

    compile("io.springfox:springfox-swagger2:2.9.2") {
        exclude module: 'mapstruct' // necessary in my case to not end up with multiple mapstruct versions
    }
    compile "io.springfox:springfox-bean-validators:2.9.2"
    compile "io.springfox:springfox-swagger-ui:2.9.2"
    

    Configured Swagger via

    @Configuration
    @EnableSwagger2
    @Import(springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration.class)
    public class SwaggerConfiguration {
    
        public static final String AUTHORIZATION_HEADER = "Authorization";
        public static final String DEFAULT_INCLUDE_PATTERN = "/api/.*";
        private final Logger log = LoggerFactory.getLogger(SwaggerConfiguration.class);
    
        @Bean
        public Docket swaggerSpringfoxDocket() {
            log.debug("Starting Swagger");
            Contact contact = new Contact(
                "Matyas Albert-Nagy",
                "https://justrocket.de",
                "matyas@justrocket.de");
    
            List<VendorExtension> vext = new ArrayList<>();
            ApiInfo apiInfo = new ApiInfo(
                "Backend API",
                "This is the best stuff since sliced bread - API",
                "6.6.6",
                "https://justrocket.de",
                contact,
                "MIT",
                "https://justrocket.de",
                vext);
    
            Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo)
                .pathMapping("/")
                .apiInfo(ApiInfo.DEFAULT)
                .forCodeGeneration(true)
                .genericModelSubstitutes(ResponseEntity.class)
                .ignoredParameterTypes(Pageable.class)
                .ignoredParameterTypes(java.sql.Date.class)
                .directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
                .directModelSubstitute(java.time.ZonedDateTime.class, Date.class)
                .directModelSubstitute(java.time.LocalDateTime.class, Date.class)
                .securityContexts(Lists.newArrayList(securityContext()))
                .securitySchemes(Lists.newArrayList(apiKey()))
                .useDefaultResponseMessages(false);
    
            docket = docket.select()
                .paths(regex(DEFAULT_INCLUDE_PATTERN))
                .build();
            watch.stop();
            log.debug("Started Swagger in {} ms", watch.getTotalTimeMillis());
            return docket;
        }
    
    
        private ApiKey apiKey() {
            return new ApiKey("JWT", AUTHORIZATION_HEADER, "header");
        }
    
        private SecurityContext securityContext() {
            return SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.regex(DEFAULT_INCLUDE_PATTERN))
                .build();
        }
    
        List<SecurityReference> defaultAuth() {
            AuthorizationScope authorizationScope
                = new AuthorizationScope("global", "accessEverything");
            AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
            authorizationScopes[0] = authorizationScope;
            return Lists.newArrayList(
                new SecurityReference("JWT", authorizationScopes));
        }
    }
    

    Access the ui via http://host:port/<context-root>/swagger-ui.html

    Press Authorize all requests and enter Bearer [JWT_TOKEN]

    Voila your next requests will have the JWT header

    0 讨论(0)
  • 2020-12-23 15:10

    For a quick solution, I configured my docket with a global parameter authorization header in my swaggerConfig class.

        @Configuration
        @EnableSwagger2
        public class SwaggerConfig {
          private static final Set<String> DEFAULT_PRODUCES_CONSUMES = new HashSet<String>(Arrays.asList("application/json"));
        
          @Bean
          public Docket api() {
            ParameterBuilder parameterBuilder = new ParameterBuilder();
            parameterBuilder.name("Authorization")
                    .modelRef(new ModelRef("string"))
                    .parameterType("header")
                    .description("JWT token")
                    .required(true)
                    .build();
            List<Parameter> parameters = new ArrayList<>();
            parameters.add(parameterBuilder.build());
            return new Docket(DocumentationType.SWAGGER_2).apiInfo(DEFAULT_API_INFO)
                .produces(DEFAULT_PRODUCES_CONSUMES)
                .consumes(DEFAULT_PRODUCES_CONSUMES)
                .select()
                .build()
                // Setting globalOperationParameters ensures that authentication header is applied to all APIs
                .globalOperationParameters(parameters);
          }
        }
    

    Wrote a small post authorization-field-in-swagger-ui about this.

    0 讨论(0)
  • 2020-12-23 15:18

    Your code is correct.

    There is a bug in springfox-swagger-ui/springfox-swagger2 version 2.8.0 and it seems 2.9.2 as well. I suspect you are using a version effected by this bug.

    I simply downgraded to 2.7.0 and it worked perfectly.

    0 讨论(0)
  • 2020-12-23 15:28

    For swagger version 2.9.2

    1. Create a SwaggerConfig class.

      @Bean
      public Docket api() {
          return new Docket(DocumentationType.SWAGGER_2)
                  .select()
                  .apis(RequestHandlerSelectors.any())
                  .paths(PathSelectors.any())
                  .build()
                  .apiInfo(apiInfo())
                  .securitySchemes(Arrays.asList(apiKey()));
      }
      
      private ApiInfo apiInfo() {
          return new ApiInfoBuilder()
                  .title("Sig-Predict REST API Document")
                  .description("work in progress")
                  .termsOfServiceUrl("localhost")
                  .version("1.0")
                  .build();
      }
      
      private ApiKey apiKey() {
          return new ApiKey("jwtToken", "Authorization", "header");
      }
      
      1. Then annotate each API you would like to send this Authorization header to with:

        @ApiOperation(value = "", authorizations = { @Authorization(value="jwtToken") })
        
    0 讨论(0)
提交回复
热议问题