我正在使用身份代理功能和外部 IDP。因此,用户登录到外部 IDP UI,然后 KeyCloak 代理客户端从外部 IDP 接收 JWT 令牌,并且 KeyCloak 提供 JWT 以供我们访问资源。我已经设置了默认身份提供程序功能,因此在登录时会向用户显示外部 IDP 登录屏幕。这意味着用户及其密码存储在外部 IDP 上。
当我需要在测试中以编程方式使用“直接访问授权”(资源所有者密码授权)登录时,就会出现问题。由于密码未存储在 KeyCloak 上,我总是在登录时从 KeyCloak 收到 401 Unauthorized 错误。当我尝试更改用户密码时,它开始工作,所以问题是 KeyCloak 上没有配置用户密码,并且使用“直接访问授权”KeyCloak 不会在编程登录时调用外部 IDP。
我使用以下代码获取访问令牌,但每次传递有效的用户名/密码时都会出现 401 错误。
org.keycloak.authorization.client.util.HttpResponseException: Unexpected response from server: 401 / Unauthorized
为该客户端启用了直接访问授权。
public static String login(final Configuration configuration) {
final AuthzClient authzClient = AuthzClient.create(configuration);
final AccessTokenResponse accessTokenResponse = authzClient.obtainAccessToken(USERNAME, PASSWORD);
return accessTokenResponse.getToken();
}
有什么办法可以修复吗?例如,在“直接访问授权”上调用身份代理,以便 KeyCloak 为我们提供它的有效令牌?