Swagger-ui 可以使用implicit 认证模式与keycloak 集成。
您可以在 swagger-ui 上设置 oauth2,以便它会要求您进行身份验证,而不是直接向 swagger-ui 提供访问令牌。
第一件事,你的大摇大摆需要引用安全定义,如:
"securityDefinitions": {
"oauth2": {
"type":"oauth2",
"authorizationUrl":"http://172.17.0.2:8080/auth/realms/master/protocol/openid-connect/auth",
"flow":"implicit",
"scopes": {
"openid":"openid",
"profile":"profile"
}
}
}
然后,你swagger-ui需要引用一些其他参数:用纯js,可以在index.html中使用
const ui = SwaggerUIBundle({ ...} );
ui.initOAuth({
clientId: "test-uid",
realm: "Master",
appName: "swagger-ui",
scopeSeparator: " ",
additionalQueryStringParams: {"nonce": "132456"}
})
在这段代码中,
-
authorizationUrl 是您的 keycloak 领域的授权端点
- 范围是您可以根据需要设置的东西
-
clientId 是在 keycloak 领域使用 implicit 模式参数化的客户端
- 附加参数
nonce应该是随机的,但是swagger-ui还没有使用。
如果你想在 Spring-boot 上执行所有这些,我在这里添加一个示例:
在这个框架上,你将主要使用 Springfox 的 swagger 和 swagger-ui web-jar。这是通过添加依赖项来完成的:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
通过在主类上添加注释 swagger2 来启用 Swagger:
@SpringBootApplication
@EnableSwagger2
public class TestSpringApplication {
...
然后您可以像这样设置Configuration 类:
@Configuration
public class SwaggerConfigurer {
@Bean
public SecurityConfiguration securityConfiguration() {
Map<String, Object> additionalQueryStringParams=new HashMap<>();
additionalQueryStringParams.put("nonce","123456");
return SecurityConfigurationBuilder.builder()
.clientId("test-uid").realm("Master").appName("swagger-ui")
.additionalQueryStringParams(additionalQueryStringParams)
.build();
}
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.testspring"))
.paths(PathSelectors.any())
.build().securitySchemes(buildSecurityScheme()).securityContexts(buildSecurityContext());
}
private List<SecurityContext> buildSecurityContext() {
List<SecurityReference> securityReferences = new ArrayList<>();
securityReferences.add(SecurityReference.builder().reference("oauth2").scopes(scopes().toArray(new AuthorizationScope[]{})).build());
SecurityContext context = SecurityContext.builder().forPaths(Predicates.alwaysTrue()).securityReferences(securityReferences).build();
List<SecurityContext> ret = new ArrayList<>();
ret.add(context);
return ret;
}
private List<? extends SecurityScheme> buildSecurityScheme() {
List<SecurityScheme> lst = new ArrayList<>();
// lst.add(new ApiKey("api_key", "X-API-KEY", "header"));
LoginEndpoint login = new LoginEndpointBuilder().url("http://172.17.0.2:8080/auth/realms/master/protocol/openid-connect/auth").build();
List<GrantType> gTypes = new ArrayList<>();
gTypes.add(new ImplicitGrant(login, "acces_token"));
lst.add(new OAuth("oauth2", scopes(), gTypes));
return lst;
}
private List<AuthorizationScope> scopes() {
List<AuthorizationScope> scopes = new ArrayList<>();
for (String scopeItem : new String[]{"openid=openid", "profile=profile"}) {
String scope[] = scopeItem.split("=");
if (scope.length == 2) {
scopes.add(new AuthorizationScopeBuilder().scope(scope[0]).description(scope[1]).build());
} else {
log.warn("Scope '{}' is not valid (format is scope=description)", scopeItem);
}
}
return scopes;
}
}
您可以在此代码中更新很多内容。这和以前大体相同:
-
nonce 应该是随机的东西(swagger-ui 还没用)
-
clientId 您需要根据您在 keycloak 中设置的客户端进行设置
-
basePackage: 你需要设置你所有控制器所在的包
- 如果您需要 api-key,您可以启用它并将其添加到安全方案列表中
-
LoginEndpoint: 需要是你keycloak领域的授权端点
-
scopeItems:您希望用于此身份验证的范围。
它会产生和之前一样的东西:更新swagger添加securityDefinition并使swagger-UI接受clientId、nonce、...的参数。