web-dev-qa-db-fra.com

Comment utiliser swagger avec l'API OAuth?

Est-il possible d'utiliser swagger comme outil de documentation/de test pour les API qui utilisent OAuth2? Je ne vois rien sur le site swagger (ni ailleurs d'ailleurs). Chaque utilisation que j'ai vue utilise soit une clé API, HTTP Basic ou des cookies.

18
fool4jesus

J'ai travaillé dans le même sens. Swagger acceptera tous les en-têtes ou clés d’API définis par URL. L'ajout d'un assistant de validation à l'API et à l'application est une approche standard. 

Oauth nécessite une révision HTML et/ou une connexion pour démarrer le processus de prise de contact. Cela signifie qu'une API swagger devra prendre en charge une interface Web pour une ouverture de session et une ouverture de session standard. Le fait de lancer oauth en swagger donne lieu à quelques boucles logiques qui, à long terme, ne sont pas faciles à supporter.

Une approche différente que nous explorons est la possibilité de laisser l’API gérer et stocker les jetons d’accès pour un certain nombre de fournisseurs Oauth différents; GitHub, Twitter et Facebook. Cela pourrait également entraîner des boucles de connexion. 

5
d1b1

tard dans la soirée, mais le support oAuth est maintenant dans 1.3.0-RC1 de swagger-core . La bibliothèque javascript qui peut supporter oAuth a été publiée hier dans swagger-js . Enfin, le swagger-ui est en phase de développement et aura bientôt un flux oAuth implicite et un flux serveur.

5
fehguy

l'article du blog http://developers-blog.helloreverb.com/enabling-oauth-with-swagger/ cité par @fehguy montre un exemple de code Java pour inclure les données d'autorisation générées par swagger dans json, Cependant, ma question était de savoir où il devrait être inclus avec l'application avec Spring, JAXRS et CXF. Je ne l'ai pas trouvé dans CXF + JAXRS. Exemple: https://github.com/swagger-api/swagger-core/tree/master/samples/Java-jaxrs-cxf

Cependant, cherchez un peu plus et getcha!

https://github.com/swagger-api/swagger-core/blob/master/samples/Java-jersey-spring/src/main/resources/beans-asset-ws.xml

Il est nécessaire d'inclure un bean avec une classe appelée Bootstrap (étend HttpServlet) et un bloc statique!

Opinion: Peut-être serait-il plus «compatible avec les ressorts» chargé à partir d'annotations par le scanner SwaggerConfig dans la classe Rest au lieu d'un bloc statique dans une servlet.

3
Eduardo Fabricio
@Configuration
public class SwaggerConfiguration {

    @Bean
    @DependsOn("jaxRsServer") //org.Apache.cxf.endpoint.Server bean
    public ServletContextInitializer initializer() {
        return new ServletContextInitializer() {
            @Override
            public void onStartup(ServletContext servletContext) throws ServletException {
                BeanConfig scanner = (BeanConfig) ScannerFactory.getScanner();
                Swagger swagger = scanner.getSwagger();
                servletContext.setAttribute("swagger", swagger);
            }
        };
    }

    @Bean
    public Feature swaggerFeature() {
        XSwagger2Feature feature = new XSwagger2Feature();

        return feature;
    }

    @Bean
    public FilterRegistrationBean swaggerApiFilter() {
        ApiOriginFilter filter = new ApiOriginFilter();

        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(filter);
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);

        return registrationBean;
    }

    public static class XSwagger2Feature extends Swagger2Feature {

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

            BeanConfig scanner = (BeanConfig) ScannerFactory.getScanner();
            Swagger swagger = scanner.getSwagger();
            swagger.securityDefinition("api_key", new ApiKeyAuthDefinition("api_key", In.HEADER));
            swagger.securityDefinition("petstore_auth", 
              new OAuth2Definition()
                .implicit("http://petstore.swagger.io/api/oauth/dialog")
                .scope("read:pets", "read your pets")
                .scope("write:pets", "modify pets in your account"));
        }

    }

}
0