java - 从 Keycloak 访问 admin/groups OIDC API 时出现错误 403
问题描述
仅使用 keycloak-authz-client (6.0.1)(无 Spring Security),我需要从我的服务提供商处读取用户信息和用户组。
在获得正确的访问令牌后,感谢 AuthzClient,我能够访问用户信息 API:
UriBuilder target = UriBuilder.fromUri(kcURL);
target.path("realms/{realm}/protocol/openid-connect/userinfo")
.resolveTemplate("realm", this.realm);
UserInfoOIDC info = new UserInfoOIDC();
try {
UserInfo response = this.buildBearerInvocation(target, accessToken).get(UserInfo.class);
info.setName(response.getName());
info.setUsername(response.getPreferredUsername());
info.setCompleted(true);
log.info("User info successfully retrieved from {}", this.realm);
} catch (WebApplicationException e) {
log.error("User info failure on {}: {}", this.realm, e.getMessage());
}
...
private Invocation.Builder buildBearerInvocation(UriBuilder target, String accessToken) {
WebTarget webTarget = restClient.target(target);
Invocation.Builder builder = webTarget.request(APPLICATION_JSON)
.header(AUTHORIZATION, "Bearer " + accessToken);
return builder;
}
但我无法访问“管理 API”:
UriBuilder target = UriBuilder.fromUri(kcURL);
target.path("admin/realms/" + this.realm);
target.path("users/" + userId);
target.path("groups");
try {
return this.buildBearerInvocation(target, accessToken)
.get(GroupRepresentation.class);
} catch (WebApplicationException e) {
log.error("User groups failure on realms {}: {}", this.realm, e.getMessage());
}
[main] INFO com.LoggingFilter - 处理http://localhost:8080/auth/admin/realms/TestRealm/users/0f443554-01d0-4b40-a652-0c8c174632d4/groups [main] 错误 com.KeycloakProvider - 用户组失败领域 TestRealm:HTTP 403 禁止
我想知道这是否可能只是来自用户访问权限不足,或者是来自这里的 CORS 问题(我已将“127.0.0.1 localhost-auth”添加到我的 etc/hosts 文件中,完全不确定是否有任何不过在这里提供帮助)。如何向用户打开“管理 API”、更多 CORS 配置或用户的任何特殊角色?
已编辑 - Keycloak Admin Client 在这里无济于事(HTTP 403 Forbidden 也是如此):
@Test
public void checkKeycloakAdminClient() {
Keycloak client = KeycloakBuilder.builder()
.serverUrl(url)
.realm(realm)
.username(adminUsername)
.password(adminPassword)
.clientId(clientId)
.clientSecret(clientSecret)
.build();
RealmResource realmResource = client.realm(realm);
UsersResource usersResource = realmResource.users();
List<UserRepresentation> users = usersResource.search(username);
}
解决方案
将“领域管理”领域客户端中的所有“查看-...”和“查询-...”可用客户端角色分配给管理员用户(请参阅用户/角色映射)。
推荐阅读
- go - 我应该如何将导入用于带有 go 模块的子文件夹?
- c++ - LLVM - 添加指令后设置 BasicBlock 的插入点会导致段错误
- python - 在子图位置上绘制图例
- angular - 为什么即使 *ngIf 设置为 true,@ViewChild 仍然未定义
- django - 带有UniqueConstraint的完整性错误django
- python - 使用pyngrok时如何防止我的python程序加载?
- r - 在 R 中抓取新闻标题的问题
- parsing - 如何跳过 YAML 流中出现错误的文档?
- ruby-on-rails - 在 ruby 中运行多个命令行
- python - 为什么 sqlalchemy first() 更新多条记录