我是Swagger的新手。
我正在使用Swagger UI生成swagger文档。我有两个API调用。第一个调用是根据用户名和密码生成令牌。第二次通话需要第一次通话产生的令牌。
如何使用Swagger UI为第二次调用设置该令牌?
答案 0 :(得分:25)
@ApiImplicitParams
和@ApiImplicitParam
可以解决问题:
@GET
@Produces("application/json")
@ApiImplicitParams({
@ApiImplicitParam(name = "Authorization", value = "Authorization token",
required = true, dataType = "string", paramType = "header") })
public String getUser(@PathParam("username") String userName) {
...
}
您可能希望手动描述操作参数。这可能有多种原因,例如:
- 使用不使用JAX-RS注释的Servlet。
- 想要隐藏定义的参数,并使用完全不同的定义覆盖它。
- 描述在到达JAX-RS实现之前过滤器或其他资源使用的参数。
Swagger UI将会更新,您可以从那里发送令牌。不需要对HTML进行任何更改。
注意:不久前,在使用Swagger记录REST API时,我意识到只添加@ApiImplicitParam
是不够的(即使您只有一个参数)。无论如何,您还必须添加@ApiImplicitParams
。
答案 1 :(得分:2)
这是一个老问题,但这是我最近用我的JWT代币版本2.7.0解决的问题
在你的招摇配置中,添加以下.weak_definition
bean。将第五个参数留空或空的重要部分。
SecurityConfiguration
将@Bean
public SecurityConfiguration securityInfo() {
return new SecurityConfiguration(null, null, null, null, "", ApiKeyVehicle.HEADER,"Authorization","");
}
添加到主securitySchemes(Lists.newArrayList(apiKey()))
bean。
Docket
然后在用户界面中,您需要点击授权按钮并输入" Bearer access_token" (对于授权文本框)其中 access_token 是由jWT令牌服务器提供的令牌。
保存此授权后,该授权将对所有终点生效。为每个端点添加单独的文本字段看起来非常麻烦。
答案 2 :(得分:2)
我对2.9.2 Swagger版本的配置以在Swagger UI上添加授权并发送Bearer令牌
@Bean
public Docket api(ServletContext servletContext) {
return new Docket(DocumentationType.SWAGGER_2)...
.securitySchemes(Arrays.asList(apiKey()))
.securityContexts(Collections.singletonList(securityContext()));
}
private SecurityContext securityContext() {
return SecurityContext.builder().securityReferences(defaultAuth()).forPaths(PathSelectors.regex("/.*")).build();
}
private List<SecurityReference> defaultAuth() {
final AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
final AuthorizationScope[] authorizationScopes = new AuthorizationScope[]{authorizationScope};
return Collections.singletonList(new SecurityReference("Bearer", authorizationScopes));
}
private ApiKey apiKey() {
return new ApiKey("Bearer", "Authorization", "header");
}
答案 3 :(得分:1)
您必须自定义swagger index page才能实现我的目标。
您可以输入&#39; input_apiKey&#39;隐藏并为用户名和密码添加两个输入。然后进行ajax调用以使用令牌更新隐藏的输入。
答案 4 :(得分:0)
有一种可能通过使用responseInterceptor和requestInterceptor起作用的黑客手段
使用responseInterceptor
对第一个API调用的第一个捕获响应,并保存令牌(在示例中为本地存储),然后使用requestInterceptor
将Authorization
标头与保存的令牌。
const ui = SwaggerUIBundle({
...
responseInterceptor:
function (response) {
if (response.obj.access_token) {
console.log(response.obj.access_token)
const token = response.obj.access_token;
localStorage.setItem("token", token)
}
return response;
},
requestInterceptor:
function (request) {
console.log('[Swagger] intercept try-it-out request');
request.headers.Authorization = "Bearer " + localStorage.getItem("token");
return request;
}
}
答案 5 :(得分:0)
另一个选择是添加globalOperationParameters
。它将在每个端点中添加一个授权字段。
定义授权标头参数:
Parameter authHeader = new ParameterBuilder()
.parameterType("header")
.name("Authorization")
.modelRef(new ModelRef("string"))
.build();
将其添加到Docket
配置中:
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(...)
.paths(...)
.build()
.apiInfo(...)
.globalOperationParameters(Collections.singletonList(authHeader));
答案 6 :(得分:0)
将SpringDoc与springdoc-openapi-maven-plugin结合使用,我的选择是使用SwaggerConfig.Java:
@Configuration
public class SwaggerConfiguration {
@Bean
public OpenAPI customOpenAPI(@Value("${project.version}") String appVersion) {
OpenAPI openApi = new OpenAPI();
openApi.info(
new Info()
.title("Title Example")
.version(appVersion)
.description("Swagger server created using springdocs - a library for OpenAPI 3 with spring boot.")
);
openApi.components(
new Components().addSecuritySchemes("bearer-jwt",
new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")
.in(SecurityScheme.In.HEADER).name("Authorization"))
);
openApi.addSecurityItem(
new SecurityRequirement().addList("bearer-jwt", Arrays.asList("read", "write"))
);
return openApi;
}
}