web-dev-qa-db-fra.com

Springfox swagger-ui.html incapable de déduire l'URL de base - Causé par des cookies manquants

Nous avons nos services Spring Boot derrière une passerelle API. Avec une version antérieure de Springfox - 2.1.2, nous n'avons eu aucun problème lors du chargement du swagger-ui.html page. Cela a fonctionné avec Spring Boot 1.4.3.RELEASE. Depuis lors, nous avons mis à niveau vers Boot 1.5.7 et mis à jour Springfox vers 2.8.0.

Maintenant, si nous chargeons la page, nous obtenons une boîte d'alerte avec le long message suivant.

Impossible de déduire l'URL de base. Cela est courant lorsque vous utilisez l'enregistrement de servlet dynamique ou lorsque l'API se trouve derrière une passerelle API. L'URL de base est la racine de l'endroit où toutes les ressources swagger sont servies. Par exemple si l'api est disponible sur http://example.org/api/v2/api-docs alors l'url de base est http://example.org/api/ . Veuillez saisir l'emplacement manuellement

J'ai obtenu quelques indices en cherchant en ligne, mais il ne semble pas que ces situations s'appliquent à nous. D'une part, si je reviens simplement aux versions, cela recommence à fonctionner via la même passerelle API.

En suivant le trafic, il semble que les appels à trois ressources XHR effectués par la page .html causent des problèmes. Ceux-ci retournent 401 de notre passerelle API. Et la raison pour laquelle ils retournent 401 est parce que les cookies ne sont pas transmis.

Les trois appels sont:

Si je charge ces URL comme de simples demandes de navigateur - elles fonctionnent - car des cookies sont envoyés.

Je doute que CORS s'applique puisque le HTML est servi à partir de la même adresse que le JSON swagger et les appels de service réels.

Une idée pourquoi cela peut arriver? Quelqu'un a fait face à des problèmes similaires? Suggestions de solution? Merci d'avance.

18
Arnab Gupta

Ajoutez la configuration de sécurité - URL suivantes qui sont ignorées pour l'authentification ::

private static final String[] AUTH_WHITELIST = {
        "/swagger-resources/**",
        "/swagger-ui.html",
        "/v2/api-docs",
        "/webjars/**"
};

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(AUTH_WHITELIST);
}
10
panksy2k

L'ajout d'annotations ci-dessous à la classe Spring Boot a résolu ce problème pour moi.

@ EnableSwagger2

J'utilise la version swagger

 <version>2.9.2</version>
8
Arindam

VOIR MODIFIER CI-DESSOUS

Utilisez-vous la sécurité du printemps?

Si oui, vous ignorez probablement certaines ressources comme celle-ci (non?): "/swagger-resources/**", "/swagger-ui.html", "/v2/api-docs", "/webjars/**"

Essayez de le changer "/swagger-resources/**" à "**/swagger-resources/**".

Ma configuration de sécurité spécifique pour swagger est:

private static final String[] AUTH_LIST = {
        // -- swagger ui
        "**/swagger-resources/**",
        "/swagger-ui.html",
        "/v2/api-docs",
        "/webjars/**"
};

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests().antMatchers(AUTH_LIST).authenticated()
    .and()
    .httpBasic().authenticationEntryPoint(swaggerAuthenticationEntryPoint())
    .and()
    .csrf().disable();
}

@Bean
public BasicAuthenticationEntryPoint swaggerAuthenticationEntryPoint() {
    BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
    entryPoint.setRealmName("Swagger Realm");
    return entryPoint;
}

Si vous avez besoin/voulez, je peux envoyer un exemple de projet à GitHub pour en savoir plus sur mes configurations de sécurité/swagger.

EDIT 2018/04/10

Ce problème est dû à une mauvaise version de springfox. Voir ce problème sur github pour résoudre le problème .

À la postérité:

Dans pom.xml

...
<repositories>
    <repository>
        <id>swagger</id>
        <name>swagger</name>
        <url>http://oss.jfrog.org/artifactory/oss-snapshot-local</url>
    </repository>
</repositories>
...
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.8.1-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.8.1-SNAPSHOT</version>
</dependency>
...

Classe qui étend WebSecurityConfigAdapter:

@Configuration
public class WebSecurityConfigEntryPointApplication extends WebSecurityConfigurerAdapter {

    private static final List<String> AUTH_LIST = Arrays.asList(
            "/swagger-resources/**",
            "/swagger-ui.html**",
            "/webjars/**",
            "favicon.ico");

    @Autowired
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .antMatcher("/**").authorizeRequests().anyRequest().authenticated()
                .and()
                .exceptionHandling()
                .defaultAuthenticationEntryPointFor(swaggerAuthenticationEntryPoint(), new CustomRequestMatcher(AUTH_LIST))
                .and()
                .httpBasic()
                .authenticationEntryPoint(restAuthenticationEntryPoint)
                .and()
                .csrf().disable();
    }

    @Bean
    public BasicAuthenticationEntryPoint swaggerAuthenticationEntryPoint() {
        BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
        entryPoint.setRealmName("Swagger Realm");
        return entryPoint;
    }

    private class CustomRequestMatcher implements RequestMatcher {

        private List<AntPathRequestMatcher> matchers;

        private CustomRequestMatcher(List<String> matchers) {
            this.matchers = matchers.stream().map(AntPathRequestMatcher::new).collect(Collectors.toList());
        }

        @Override
        public boolean matches(HttpServletRequest request) {
            return matchers.stream().anyMatch(a -> a.matches(request));
        }

    }

}

RestAuthenticationEntryPoint:

@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
    }
}
5
Marco Blos

Cela m'est arrivé, j'utilisais SpringBoot 1.5.16 et Springfox 2.9.1.

Dans mon application.properties, J'avais défini server.servlet-path=/api, mais, en quelque sorte, le swagger-ui ignorait la valeur définie. J'ai essayé tellement de façons différentes de faire fonctionner cela, et finalement j'ai trouvé une solution:

 @Configuration
 @EnableSwagger2
 public class SwaggerConfiguration extends WebMvcConfigurationSupport {                                    

    @Bean
    public Docket apiMonitoramento() { 
        return new Docket(DocumentationType.SWAGGER_2)
                .select()                                  
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())                          
                .build()    
                .apiInfo(apiInfo());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()              
                .title("REST API")
                .description("Servicesx")               
                .build();
    }

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
 }

J'accédais à http: // localhost: 8080/context/swagger-ui.html , mais avec cette configuration, l'URL correcte est: http: // localhost: 8080/context/api /swagger-ui.html

4
carolnogueira

Mettez à niveau les dépendances springfox-swagger2 et springfox-swagger-ui vers 2.9.2 et assurez-vous également que le pack de base est correctement fourni.

return new Docket(DocumentationType.SWAGGER_2).select()
            .apis(RequestHandlerSelectors
                .basePackage("org.abc.xyz.controller"))
            .paths(PathSelectors.regex("/.*"))
            .build().apiInfo(apiEndPointsInfo());
2
Harshavardhan

Dans mon cas, la cause du problème était d'avoir:

@ComponentScan(basePackageClasses = {ApplicationRoot.class })

deux fois en deux Java.

après avoir retiré celui supplémentaire, le problème a disparu.

2
Guram Kankava

essayez avec le port 8080 - a fonctionné pour moi après l'avoir changé en 8080

0
Pravin

Je n'utilise pas la sécurité du printemps est arrivé cette question. Mon projet utilise le module multiple Maven, lorsque l'accès à l'hôte local: 8080/swagger-ui.html est arrivé à cette question, j'ajoute d'abord @ EnableSwagger2 dans la classe SwaggerConf, enfin je déplace @EnableSwagger vers la classe SpringBoot Application, cette question est résolue. Première:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket api(){
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.zuoyan."))
                .paths(PathSelectors.any())
                .build();
    }

}

Finalement:

 @SpringBootApplication(scanBasePackages = {"com.zuoyan.springboot.appmissionhall"})
 @EnableSwagger2
public class ApplicationStartUpApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationStartUpApplication.class, args);
    }

}
0
Zuoyan

J'ai ajouté @EnableSwagger2WebMvc à la classe App pour le corriger. J'utilise Spring boot 2.3.0.BUILD-SNAPSHOT et io.springfox 3.0.0-SNAPSHOT. La classe SpringFoxConfig reste la même.

package com.telixia.educare.academy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

@EnableSwagger2WebMvc
@SpringBootApplication
public class AcademyApplication {

    public static void main(String[] args) {
        SpringApplication.run(AcademyApplication.class, args);
    }

}
0
Nditah

Si vous ne spécifiez aucune option d'analyse de composant spéciale, vous serez confronté à ce problème si vous placez la classe avec l'annotation @ EnableSwagger2 dans un package qui n'est pas dans la hiérarchie de votre classe Spring Boot Application (@SpringBootApplication).

Supposez votre classe Spring Boot Application dans "de.oopexpert.app", puis mettez la classe annotée @ EnableSwagger2 dans ...

  • de.oopexpert.app fonctionnera
  • de.oopexpert.app.config fonctionnera
  • de.oopexpert.config PAS fonctionnera

Vous pouvez adapter les options d'analyse de vos composants en ajoutant @ComponentScan (basePackages = {"de.oopexpert"}) pour spécifier une racine différente de la hiérarchie.

0
oopexpert