按照另一个 Keycloak 身份提供商线程的答案,我设置了两个领域来将用户分开。
external realm
包含一个 Keycloak OpenID Connect identity provider
到 internal realm
。在 external realm
中配置了 client
,它允许我的应用程序通过 client adapter
验证用户。
我正在使用Keycloak版本
18.0.0
。
任何未指定的设置均为“关闭”、未设置(空白条目)或默认值。
identity provider
中配置的
external realm
具有以下设置:
Enabled: true
Store Tokens: ON
Trust Email: ON
First Login Flow: first broker login
Sync Mode: force
Auth URL
、Token URL
、Logout URL
和User Info URL
均设置为匹配的internal realm
客户端Client Authentication: Client secret sent as basic auth
Client Secret
设置为匹配的客户端密钥Issuer
设置为 internal realm
URL。例如:https://<hostname>/auth/realms/<internalRealmName>
Default Scopes: openid
Prompt: unspecified
Validate Signatures: ON
JWKS URL: ON
、JWKS URL
设置为匹配的 internal realm
证书位置。例如:https://<hostname>/auth/realms/<internalRealmName>/protocol/openid-connect/certs
Use PKCE: ON
PKCE Method: S256
client
中配置的
internal realm
具有以下设置:
Enabled: true
Client Protocol: openid-connect
Access Type: confidential
Standard Flow Enabled: ON
Valid Redirect URIs: https://<hostname>/auth/realms/<externalRealmName>/broker/<internalRealmName>/endpoint
Backchannel Logout Session Required: ON
Credentials
Client Authenticator: Client Id and Secret
external realm
identity provider
配置中external realm
中存在的用户可以登录,以及配置为通过另一个单独的外部 ODIC 登录的用户identity provider
(这不是internal realm
的身份提供者,只是一个身份提供商登录流程正在运行的示例)。
尝试通过 identity provider
登录到
internal realm
的用户无法登录。登录页面显示 Unexpected error when authenticating with identity provider
。检查 Keycloak 日志,我看到以下错误:
WARN [org.keycloak.events] (default task-405) type=IDENTITY_PROVIDER_LOGIN_ERROR, realmId=<externalRealmName>, clientId=<externalRealmClientName>, userId=null, ipAddress=<removed>, error=identity_provider_login_failure, code_id=258c44bd-88fc-44a1-b93c-18225b00df49
ERROR [org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider] (default task-405) Failed to make identity provider oauth callback: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
请求帮助identity provider
时无法验证证书?它能够使用
external realm
以及另一个 identity provider
的 SSL 设置成功进行身份验证用于外部连接。我无法弄清楚Keycloak认证失败到底发生在哪里。
您需要将证书添加到keycloak的密钥库中。
复制身份验证流程中使用的令牌 url。将令牌粘贴到浏览器网址。
在浏览器中导航到令牌 URL。打开开发工具并将证书导出到*.crt(例如digicert.crt)
将证书加载到密钥库文件:
keytool -importcert -trustcacerts -storepass 密码 -noprompt -storetype PKCS12 -keyalg RSA -keysize 2048 -alias digicert -file digicert.crt -keystore conf/server.keystore
在 keycloak 启动时加载密钥库文件: --spi-truststore-file-file=/opt/keycloak/conf/server.keystore