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,您可以发送访问令牌。
我添加了 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,您可以发送访问令牌。