Swagger UI将身份验证令牌传递给标头中的API调用

时间:2015-10-30 11:48:18

标签: rest jersey swagger swagger-ui

我是Swagger的新手。

我正在使用Swagger UI生成swagger文档。我有两个API调用。第一个调用是根据用户名和密码生成令牌。第二次通话需要第一次通话产生的令牌。

如何使用Swagger UI为第二次调用设置该令牌?

7 个答案:

答案 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) {
    ...
}

来自documentation

  

您可能希望手动描述操作参数。这可能有多种原因,例如:

     
      
  • 使用不使用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调用的第一个捕获响应,并保存令牌(在示例中为本地存储),然后使用requestInterceptorAuthorization标头与保存的令牌。

            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));

它看起来像这样: enter image description here

答案 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;
    }
}