spring 使用 swagger OAuth 启动不工作

spring boot with swagger OAuth not working

我添加了 swagger 依赖项并启用了它,并且能够看到所有 API 但授权 API 不起作用。

我正在使用以下版本的 swagger:

    <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.9.2</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.9.2</version>
    </dependency>

下面是我的代码:

        @Configuration
        @EnableSwagger2
        public class SwaggerConfig {
            
             @Value("${security.oauth2.client.client-id}")
            public String CLIENT_ID;
             
             @Value("${security.oauth2.client.client-secret}") 
            public String CLIENT_SECRET;
            
            
            public String AUTH_SERVER = "https://login.microsoftonline.com/common/oauth2/v2.0";
            
            
            @Bean
            public Docket swaggerConfiguration() {
                return new Docket(DocumentationType.SWAGGER_2)
                        .select()
                        //.apis(RequestHandlerSelectors.any()) 
                        //.paths(PathSelectors.ant("/api/v1/**/**"))
                        .apis(RequestHandlerSelectors.basePackage("edu.mayo.ima.ccs.rpc_backend.controller"))
                        .paths(PathSelectors.any()) 
                        .build()
                        .securitySchemes(Arrays.asList(securityScheme()))
                        .securityContexts(Arrays.asList(securityContext()))
                        .apiInfo(getApiInfo());
                
            }
            
            @Bean
            public SecurityConfiguration security() {
                return SecurityConfigurationBuilder.builder()
                    .clientId(CLIENT_ID)
                    .clientSecret(CLIENT_SECRET)
                    .scopeSeparator(" ")
                    .useBasicAuthenticationWithAccessCodeGrant(true)
                    .build();
            }
            
            private SecurityScheme securityScheme() {
                GrantType grantType = new AuthorizationCodeGrantBuilder()
                    .tokenEndpoint(new TokenEndpoint(AUTH_SERVER + "/token", "oauthtoken"))
                    .tokenRequestEndpoint(
                      new TokenRequestEndpoint(AUTH_SERVER + "/authorize", CLIENT_ID, CLIENT_SECRET))
                    .build();
        
                SecurityScheme oauth = new OAuthBuilder().name("spring_oauth")
                    .grantTypes(Arrays.asList(grantType))
                    .scopes(Arrays.asList(scopes()))
                    .build();
                return oauth;
            }
            
            private ApiInfo getApiInfo() {
                return new ApiInfo(
                        "Protocol Catalag ",
                        "",
                        "1.0.0",
                        "",
                        null,
                        "",
                        "",
                        Collections.emptyList()
                );
            }
            
            private SecurityContext securityContext() {
                return SecurityContext.builder()
                  .securityReferences(
                    Arrays.asList(new SecurityReference("spring_oauth", scopes())))
                  .forPaths(PathSelectors.any())
                  .build();
            }
            
            private AuthorizationScope[] scopes() {
                AuthorizationScope[] scopes = { 
                  new AuthorizationScope("access_as_user", "access for application")
                 };
                return scopes;
            }
    }

使用上述配置,所有 Api 都显示在 swagger 上,但授权它们会出错。 下面是单击授权按钮时的屏幕。

感谢您的帮助!

请确保在门户中的 API 权限下添加 access_as_user 权限,并确保公开 API。 Application id uri格式为api://,你可以给app取其他名字。 在这里的示例中,我给出了应用程序 ID uri:api://my_spring_boot_api

然后您应该能够在范围下看到添加的范围。

然后select你添加的access_as_user权限。(API权限>添加权限>我的APIs>select需要的应用程序>检查权限>添加权限)

那么您可以同意如下

这里我暴露了作用域>> api://my_spring_boot_api/access_as_user。确保使用在门户中配置的相同范围包含在应用程序配置中。 范围也应包括代码中公开资源的标识符(应用程序 ID URI)。

这里例如: 范围:“api://my_spring_boot_api/access_as_user “

并且当您调用 Web 应用程序时,请确保发送 Id_token,如果您调用图表 api,您可以发送访问令牌。