带有 OpenIdConnect 外部身份提供者的 Keycloak
Posted
技术标签:
【中文标题】带有 OpenIdConnect 外部身份提供者的 Keycloak【英文标题】:Keycloak with OpenIdConnect external identityprovider 【发布时间】:2017-12-27 14:52:02 【问题描述】:我有一个在Keycloak
注册的外部openidconnect
身份提供者。当客户端应用程序尝试访问受保护的资源时,它会被重定向到KeyCloak
登录页面。在登录页面上,我启用了外部 openidconnect
提供程序按钮。一旦用户单击按钮,他就会被带到外部身份提供者(即 identityserver3 实例)。外部提供者确实对用户进行身份验证并发回代码。
现在外部身份提供者中注册客户端的重定向网址是 keycloak 的重定向网址。因此,在外部 IDP 身份验证成功后,它会将代码(因为它是身份验证代码流)发送回重定向 url 处的 keycloak:
http://localhost:5555/auth/realms/QA/broker/keycloak-client/endpoint?code=7bcf5157105199d50874e64eabf03858&state=wQhNIEKW0Ws6CotZg2EsvOorjDVQlWVvobcM2skPSXo.keycloak-client&session_state=rhgu-BXT8FniG9Z-UARKpp_f-V1nLN-VxFmSE3PSxDg.99b2d903367208e4261fefa475afb1eb
在 URL 中,如果您看到它以 endpoint
结尾。我不认为这是正确的,但我无法在 KeyCloak 中更改它(它已被禁用)并且因为在外部 IDP 客户端配置中。
KeyCloak 不理解上面的 url 并出现错误消息“使用身份提供者进行身份验证时出现意外错误”
KeyCloak
不应该理解代码流程并在收到代码后再次请求令牌。然后外部 IDP 将使用令牌进行响应,Keycloak
会将该令牌发回给客户端(也将存储它以备将来使用)。
有人可以分享一些关于Keycloak
如何通过代码流与外部 openidconnect ID 提供者合作的知识。
【问题讨论】:
嗨。你有解决办法吗? 【参考方案1】:通常,外部身份提供者的重定向 URI 采用 keycloak-host/auth/realms/realm/broker/provider/endpoint
的形式。当您在外部身份提供者中注册您的客户端时,您必须将其指定为重定向 URI。通过外部 IdP 对用户进行身份验证后,授权码将发送到此 url,然后将其重定向到客户端应用程序的重定向 url(在 Keycloak 中注册客户端时指定)。
Unexpected error when authenticating with Identity Provider
是 Keycloak 针对 OAuth 流程期间发生的几个错误发送的一般错误消息。如果不通过堆栈跟踪或提示中的日志,您将无法确定实际原因。
【讨论】:
【参考方案2】:您收到此错误是因为 keyclaok 无法通过交换授权码从 identityserver3 获取令牌。您在哪里托管 identityserver3?它是否具有真正的 ca 证书或者您正在使用自签名证书?您是否在 keycloak 外部 IDP 配置中正确配置了client_id
、secret
、token endpoint
?您可以手动测试我在 identityserver3 的令牌端点中发布的 client_id
、secret
、code
(您收到的)。
【讨论】:
以上是关于带有 OpenIdConnect 外部身份提供者的 Keycloak的主要内容,如果未能解决你的问题,请参考以下文章
IdentityServer3 和通过 OpenIDConnect 进行外部登录
IdentityServer 4,OpenIdConnect 重定向到外部登录 url
带有 WSO2 身份服务器的 Spring Cloud Security