webentwicklung-frage-antwort-db.com.de

Spring Boot & Swagger UI. JWT-Token setzen

Ich habe eine Swagger-Konfiguration wie diese

@EnableSwagger2
@Configuration
public class SwaggerConfig {
    @Bean
    public Docket api() {
        List<SecurityScheme> schemeList = new ArrayList<>();
        schemeList.add(new ApiKey(HttpHeaders.AUTHORIZATION, "JWT", "header"));
        return new Docket(DocumentationType.SWAGGER_2)
                .produces(Collections.singleton("application/json"))
                .consumes(Collections.singleton("application/json"))
                .ignoredParameterTypes(Authentication.class)
                .securitySchemes(schemeList)
                .useDefaultResponseMessages(false)
                .select()
                .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot")))
                .paths(PathSelectors.any())
                .build();
    }
}

Wenn ich in der Swagger-Benutzeroberfläche auf die Schaltfläche Authorize klicke, gebe ich mein JWT-Token in das Wertefeld eyJhbGc..nN84qrBg ein. Nun gehe ich davon aus, dass jede Anfrage, die ich über die Swagger-Benutzeroberfläche mache, die JWT im Header enthält. Dies ist jedoch nicht der Fall. Keine Anforderung enthält einen Berechtigungskopf.

Was vermisse ich?

5
isADon

Unterstützung für Authorization: Bearer [JWT_TOKEN]-Header funktioniert ab Version 2.9.2

Die folgenden Abhängigkeiten wurden zu build.gradle hinzugefügt

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"

Konfigurierter Swagger über

@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",
            "[email protected]");

        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));
    }
}

Zugriff auf die Benutzeroberfläche über http://Host:port/<context-root>/swagger-ui.html

Drücken Sie auf Alle Anfragen genehmigen und geben Sie Bearer [JWT_TOKEN] ein.

 Press authorize then enter the Bearer JWT Token

Bei Ihren nächsten Anfragen erhalten Sie den JWT-Header

 enter image description here

7
Matyas

Ihr Code ist korrekt. 

Es gibt einen Fehler in Springfox-Swagger-Ui / Springfox-Swagger2 Version 2.8.0 und es scheint auch 2.9.2 zu sein. Ich vermute, Sie verwenden eine Version, die durch diesen Fehler verursacht wurde.

Ich habe einfach auf 2.7.0 heruntergestuft und es hat perfekt funktioniert.

1
rjdkolb