【问题标题】:springdoc-openapi-ui OAuth 2.0 Authorization Code flow with PKCEspringdoc-openapi-ui OAuth 2.0 授权代码流与 PKCE
【发布时间】:2020-11-07 01:38:51
【问题描述】:

我正在使用带有 springdoc-openapi-ui-1.4.3 的招摇

@SecurityRequirement(name = "security_auth")
public class ProductController {}

设置安全架构

@SecurityScheme(name = "security_auth", type = SecuritySchemeType.OAUTH2,
        flows = @OAuthFlows(authorizationCode = @OAuthFlow(
                authorizationUrl = "${springdoc.oAuthFlow.authorizationUrl}"
                , tokenUrl = "${springdoc.oAuthFlow.tokenUrl}",scopes = {
                @OAuthScope(name = "IdentityPortal.API", description = "IdentityPortal.API")})))
public class OpenApiConfig {}

安全配置

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {// @formatter:off
        http
                .authorizeRequests()
                .antMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html")
                .permitAll()
                .antMatchers(HttpMethod.GET, "/user/info", "/api/foos/**")
                .hasAuthority("SCOPE_read")
                .antMatchers(HttpMethod.POST, "/api/foos")
                .hasAuthority("SCOPE_write")
                .anyRequest()
                .authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt();
    }
}

有依赖关系

implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
implementation 'org.springdoc:springdoc-openapi-ui:1.4.3'
implementation 'org.springdoc:springdoc-openapi-security:1.4.3'
implementation "org.springframework.boot:spring-boot-starter-security"

配置设置

spring:
  profiles:
    active: dev

####### resource server configuration properties
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://localhost:5001
          jwk-set-uri: https://localhost:5001/connect/token
springdoc:
  swagger-ui:
    oauth:
      clientId: Local
      usepkcewithauthorizationcodegrant: true
  oAuthFlow:
    authorizationUrl: https://localhost:5001
    tokenUrl: https://localhost:5001/connect/token

在 swagger UI 中,clientId 为空且存在客户端密码,授权码 + PKCE 流客户端密码不应存在

【问题讨论】:

  • 你在哪里可以找到为 Java 设置这些东西的文档?对于注释或示例配置等,我似乎找不到太多。这篇文章是我发现的最有帮助的。感谢@San Jaisy 的任何帮助

标签: java spring spring-boot spring-security springdoc


【解决方案1】:

你问这个问题已经有一段时间了,但我会回复其他信息。主要问题是 UI 的误导性实现。您必须在配置中使用授权代码流,因为缺少带有 PKCE 的授权代码。因此,您必须使用授权码(因为您需要提供授权和令牌 url)并将虚拟密钥放入 yaml 中。下面的例子。

@SecurityScheme(name = "security_auth", type = SecuritySchemeType.OAUTH2,
        flows = @OAuthFlows(authorizationCode = @OAuthFlow(
                authorizationUrl = "${springdoc.oAuthFlow.authorizationUrl}"
                , tokenUrl = "${springdoc.oAuthFlow.tokenUrl}")))
public class OpenApiConfig {}

如果您想使用 PKCE 而不是纯隐式设置正确属性(如@brianbro 指出的那样)和一个虚拟秘密:

springdoc.swagger-ui.oauth.use-pkce-with-authorization-code-grant=true
springdoc.swagger-ui.oauth.clent-secret=justFillerBecausePKCEisUsed

最后,如果您想预先填写 client_id 使用配置:

springdoc.swagger-ui.oauth.client-id=YourClientId

【讨论】:

    【解决方案2】:

    你的属性语法

    usepkcewithauthorizationcodegrant

    不正确:

    这是 PKCE 的正确属性:

    springdoc.swagger-ui.oauth.use-pkce-with-authorization-code-grant=true
    

    要填写客户ID,只需使用:

    springdoc.swagger-ui.oauth.client-id=yourSPAClientId
    

    对于您对可以隐藏的现有秘密文件的评论。这看起来像是对 swagger-ui 的增强。

    您应该提交对 swagger-ui 项目的增强:

    【讨论】:

      猜你喜欢
      • 2016-10-15
      • 1970-01-01
      • 2021-04-01
      • 2020-11-27
      • 1970-01-01
      • 2018-08-05
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多