web-dev-qa-db-de.com

Wie verwende ich Swagger mit der OAuth API?

Kann Swagger als Dokumentations-/Testwerkzeug für APIs verwendet werden, die OAuth2 verwenden? Ich sehe nichts auf der Swagger-Site (oder sonstwo sonst). Bei jeder Verwendung, die ich gesehen habe, werden entweder ein API-Schlüssel, ein HTTP-Basisprogramm oder Cookies verwendet.

18
fool4jesus

Ich habe auf dieselbe Weise gearbeitet. Swagger akzeptiert alle Header- oder URL-definierten API-Schlüssel oder Token. Das Hinzufügen eines Validierungshilfsprogramms zu API und App ist ein Standardansatz. 

Oauth erfordert eine HTML-Überprüfung und/oder ein Login, um den Handshake-Prozess zu starten. Dies bedeutet, dass ein Swagger-API eine Webschnittstelle für ein standardmäßiges Anmelden und die Annahme des Gültigkeitsbereichs unterstützen muss. Wenn Sie in den Swagger einsteigen, ergeben sich einige logische Schleifen, die langfristig nicht einfach zu unterstützen sind.

Ein anderer Ansatz, den wir untersuchen, ist die Option, dass das API die Zugriffstoken für eine Reihe verschiedener Anbieter bereitstellt und speichert. GitHub, Twitter und Facebook. Dies kann ebenfalls zu Anmeldeschleifen führen. 

5
d1b1

zur Party hier spät, aber oAuth-Unterstützung gibt es jetzt in 1.3.0-RC1 von swagger-core . Die Javascript-Bibliothek, die oAuth unterstützen kann, wurde gestern in swagger-js veröffentlicht. Schließlich befindet sich der swagger-ui in der Entwicklungsphase und wird bald einen impliziten oAuth- und Server-Fluss haben.

5
fehguy

der Blogbeitrag http://developers-blog.helloreverb.com/enabling-oauth-with-swagger/ von @fehguy zitiert zeigt ein Beispiel für Java-Code, der die von swagger erzeugten Berechtigungsdaten in json enthält Meine Frage war jedoch, wo es mit Spring, JAXRS und CXF in der App enthalten sein sollte. Ich habe es in CXF + JAXRS nicht gefunden. Beispiel: https://github.com/swagger-api/swagger-core/tree/master/samples/Java-jaxrs-cxf

Auf der Suche nach etwas mehr und gotcha!

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

Erforderlich ist ein Bean mit einer Klasse namens Bootstrap (erweitert HttpServlet) und einem statischen Block!

Meinung: Vielleicht wäre es "frühlingsfreundlicher", geladen von Anmerkungen durch die Klasse "SwaggerConfig Scanner in Rest" statt eines statischen Blocks in einem Servlet.

3
@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