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

问题描述 投票:21回答:6

我是Swagger的新手。

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

如何使用Swagger UI为第二个呼叫设置该令牌?

rest jersey swagger swagger-ui
6个回答
27
投票

@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


3
投票

我对2.9.2 Swagger版本的配置,以在Swagger UI上添加授权并发送Bearer令牌

@ApiImplicitParam

2
投票

这是一个古老的问题,但这是我最近如何使用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令牌服务器提供的令牌。

保存此授权后,它将对所有端点生效。为每个端点添加单独的文本字段看起来非常麻烦。


1
投票

您必须自定义@Bean public SecurityConfiguration securityInfo() { return new SecurityConfiguration(null, null, null, null, "", ApiKeyVehicle.HEADER,"Authorization",""); } 才能完成我认为的工作。

您可以隐藏输入'input_apiKey',并为用户名和密码添加两个输入。然后,您进行ajax调用,以使用令牌更新隐藏的输入。


0
投票

有一种可能通过使用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

0
投票

另一个选项是添加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

© www.soinside.com 2019 - 2024. All rights reserved.