是否可以将 swagger 用作使用 OAuth2 的 API 的文档/测试工具?我在 swagger 网站(或其他任何地方)上看不到任何东西。我见过的每种用法都使用 API 密钥、HTTP 基本或 cookie。
5 回答
我一直在沿着同样的路线工作。Swagger 将接受任何标头或 URL 定义的 api 密钥或令牌。向 api 和应用程序添加验证助手是一种标准方法。
Oauth 确实需要 HTML 审查和/或登录才能启动握手认证过程。这意味着 swagger api 需要支持 Web 界面才能进行标准登录和范围接受。将 oauth 滚动到 swagger 会导致一些逻辑循环,从长远来看不容易支持。
我们正在探索的另一种方法是让 api 为许多不同的 oauth 提供者处理和存储访问令牌的选项;GitHub、推特和脸书。这也可能导致登录循环。
迟到了,但 oAuth 支持现在在swagger-core的 1.3.0-RC1 中。支持 oAuth 的 javascript 库昨天在swagger-js中发布。最后,swagger-ui处于开发阶段,很快就会有 oAuth 隐式和服务器流。
@fehguy 引用的博客文章http://developers-blog.helloreverb.com/enabling-oauth-with-swagger/显示了一个 java 代码示例,用于在 swagger 生成的 json 中包含授权数据,但是我的问题是它应该包含在带有 Spring、JAXRS 和 CXF 的应用程序中。我在 CXF + JAXRS 示例中没有找到它:https ://github.com/swagger-api/swagger-core/tree/master/samples/java-jaxrs-cxf
然而,寻找更多和陷阱!
必须包含一个带有名为 Bootstrap 的类(扩展 HttpServlet)和一个静态块的 Bean!
意见:也许它会更“弹簧友好”,由 SwaggerConfig Scanner 在 Rest 类中从注释加载,而不是 servlet 中的静态块。
@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"));
}
}
}