OAuth2 を使用する API のドキュメント/テスト ツールとして swagger を使用することはできますか? Swagger サイト (または他の場所) には何も表示されません。私が見たすべての使用法は、API キー、HTTP Basic、または Cookie のいずれかを使用しています。
5 に答える
私も同じ方針で仕事をしてきました。Swagger は、任意のヘッダーまたは URL で定義された API キーまたはトークンを受け入れます。API とアプリに検証ヘルパーを追加することは、標準的なアプローチです。
Oauth では、ハンドシェイク認証プロセスを開始するために、HTML レビューまたはログインが必要です。つまり、swagger API は、標準のログインとスコープの受け入れのために Web インターフェイスをサポートする必要があります。oauth を swagger にロールバックすると、いくつかのロジック ループが発生し、長期的にはサポートが容易ではありません。
私たちが検討している別のアプローチは、API が多数の異なる oauth プロバイダーのアクセス トークンを処理および保存できるようにするオプションです。GitHub、ツイッター、フェイスブック。これにより、ログイン ループも発生する可能性があります。
ここでパーティーに遅れましたが、oAuth サポートは現在、swagger -coreの 1.3.0-RC1 にあります。昨日、swagger -jsで oAuth に対応した JavaScript ライブラリがリリースされました。最後に、 swagger -uiは開発段階にあり、まもなく oAuth の暗黙的およびサーバー フローが実装されます。
@fehguy によって引用されたブログの投稿http://developers-blog.helloreverb.com/enabling-oauth-with-swagger/は、swagger によって生成された json に認証データを含める Java コードの例を示していますが、私の質問はSpring、JAXRS、および CXF を使用するアプリに含める必要があります。CXF + JAXRS サンプルで見つかりませんでした: https://github.com/swagger-api/swagger-core/tree/master/samples/java-jaxrs-cxf
しかし、もう少し探して、落とし穴 !
Bootstrap (HttpServlet を拡張) と呼ばれるクラスと静的ブロックを持つ Bean を含める必要があります。
意見: おそらく、サーブレットの静的ブロックではなく、Rest クラスの SwaggerConfig スキャナーによって注釈からロードされる方が、より「スプリングに適した」ものになるでしょう。
@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"));
}
}
}