如何使用 openapi-ui 和承载令牌(jwt)在 swagger-ui 中激活授权按钮?

Posted

技术标签:

【中文标题】如何使用 openapi-ui 和承载令牌(jwt)在 swagger-ui 中激活授权按钮?【英文标题】:How to Activate authorization-Button in swagger-ui with openapi-ui and bearer-token (jwt)? 【发布时间】:2021-03-01 00:37:43 【问题描述】:

我的任务是在 swagger-ui 站点中启用授权按钮。我使用 springdoc-openapi-ui 依赖项中的 @Operation 或 @ApiResponse 等注释制作 REST-Controller 的文档。现在我应该在 swagger 表面启用授权按钮。

我有以下介绍:https://www.baeldung.com/spring-boot-swagger-jwt 但是在这里我必须将 springfox 包含到我的 maven 依赖项中,但是当我这样做时,我会得到以下异常:

17.11.2020 19:15:46,664 ERROR [o.s.boot.SpringApplication] (main) Application run 
failed
java.lang.NoClassDefFoundError: org/springframework/data/rest/webmvc/mapping/Associations
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3137)
at java.base/java.lang.Class.getDeclaredConstructors(Class.java:2357)
(....)

另外介绍使用apikeys,但我们在应用程序中没有使用apikeys,我不知道如何使用它们。

然后我发现以下问题似乎是我的问题:Enable Authorize button in springdoc-openapi-ui for Bearer Token Authentication (JWT)

所以我从最佳答案中实现了代码:

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

@Configuration
public class OpenApiConfiguration 

  private final String moduleName;
  private final String apiVersion;

  public OpenApiConfiguration(
      @Value("$module-name") String moduleName,
      @Value("$api-version") String apiVersion) 
    this.moduleName = moduleName;
    this.apiVersion = apiVersion;
  

  @Bean
  public OpenAPI customOpenAPI() 
    final String securitySchemeName = "bearerAuth";
    final String apiTitle = String.format("%s API", StringUtils.capitalize(moduleName));

    return new OpenAPI().addSecurityItem(new SecurityRequirement().addList(securitySchemeName))
        .components(new Components().addSecuritySchemes(securitySchemeName,
            new SecurityScheme().name(securitySchemeName)
                .type(SecurityScheme.Type.HTTP)
                .scheme("bearer")
                .bearerFormat("JWT")))
        .info(new Info().title(apiTitle)
            .version(apiVersion));
  


但后来我得到以下异常:

17.11.2020 19:21:00,215 ERROR [o.s.boot.SpringApplication] (main) Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'openApiConfiguration' defined in file [<PATH>/configuration/OpenApiConfiguration.class]: Unexpected exception during bean creation; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'module-name' in value "$module-name"
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:530)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
(....)

有人能解释一下这个占位符和@Value 是如何工作的吗? 也许有人对我的问题有更好/更好的方法?我对这个话题很陌生

最好的问候和对不起我的英语不好

我喜欢肥猫

【问题讨论】:

【参考方案1】:

关于问题:无法解析值“$module-name”中的占位符“module-name”

也许我误解了这个问题,但这不只是缺少该配置的值吗?如果你只使用字符串常量,它是否有效?

尝试使用这两个属性在类路径上添加属性文件 /yaml,它应该可以工作: 模块名称=xxx api-version=xxx

【讨论】:

以上是关于如何使用 openapi-ui 和承载令牌(jwt)在 swagger-ui 中激活授权按钮?的主要内容,如果未能解决你的问题,请参考以下文章

Angular JWT 拦截器切换承载令牌以进行刷新

如何使用授权承载 + 令牌使用 Axios 注销用户

PHP Angular - JWT 授权承载令牌

Auth0 - 在 Owin 上使用带有承载访问令牌的 JWT 使用 RS256 进行身份验证

如何在axios中配置授权承载令牌?

支持 JWT 密钥轮换的承载令牌认证的 Owin 中间件