我是Swagger的新手。
我正在使用Swagger UI生成Swagger文档。我有两个API调用。第一个调用是根据用户名和密码生成令牌。第二次通话需要第一次通话生成的令牌。
如何使用Swagger UI为第二个呼叫设置该令牌?
@ApiImplicitParams
和@ApiImplicitParams
应该可以解决问题:
@ApiImplicitParam
从@ApiImplicitParam
:
您可能希望手动描述操作参数。原因可能有多种,例如:
- 使用不使用JAX-RS批注的Servlet。
- 想要隐藏定义的参数,并用完全不同的定义覆盖它。
- 描述在达到JAX-RS实现之前由过滤器或其他资源使用的参数。
Swagger用户界面将更新,因此您可以从那里发送令牌。无需更改HTML。
注:前一段时间,当使用Swagger记录REST API时,我意识到仅添加@GET
@Produces("application/json")
@ApiImplicitParams({
@ApiImplicitParam(name = "Authorization", value = "Authorization token",
required = true, dataType = "string", paramType = "header") })
public String getUser(@PathParam("username") String userName) {
...
}
是不够的(即使您只有一个参数)。无论如何,您也必须添加documentation。
我对2.9.2 Swagger版本的配置,以在Swagger UI上添加授权并发送Bearer令牌
@ApiImplicitParam
这是一个古老的问题,但这是我最近如何使用2.7.0版的JWT令牌解决此问题
在您的灵活配置中,在@ApiImplicitParam
bean下面添加。重要的部分是将第五个参数留空或为空。
@ApiImplicitParams
将@ApiImplicitParams
添加到主 @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");
}
bean。
SecurityConfiguration
然后在UI中,您需要单击Authorize按钮并输入“ Bearer access_token”(用于授权文本框),其中access_token是jWT令牌服务器提供的令牌。
保存此授权后,它将对所有端点生效。为每个端点添加单独的文本字段看起来非常麻烦。
您必须自定义@Bean
public SecurityConfiguration securityInfo() {
return new SecurityConfiguration(null, null, null, null, "", ApiKeyVehicle.HEADER,"Authorization","");
}
才能完成我认为的工作。
您可以隐藏输入'input_apiKey',并为用户名和密码添加两个输入。然后,您进行ajax调用,以使用令牌更新隐藏的输入。
有一种可能通过使用responseInterceptor和requestInterceptor起作用的hack
使用securitySchemes(Lists.newArrayList(apiKey()))
进行的第一个API调用的第一次捕获响应,并将令牌保存(在示例中为本地存储),然后使用Docket
将@Bean
public Docket docket()
{
return new Docket(DocumentationType.SWAGGER_2).select()
.....build().apiInfo(...).securitySchemes(Lists.newArrayList(apiKey()));
}
private ApiKey apiKey() {
return new ApiKey("Authorization", "Authorization", "header");
}
标头与保存的令牌相加。
swagger index page
另一个选项是添加responseInterceptor
。它将在每个端点中添加一个授权字段。
定义授权标头参数:
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;
}
}
它看起来像这样:globalOperationParameters