带有 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_idsecrettoken endpoint?您可以手动测试我在 identityserver3 的令牌端点中发布的 client_idsecretcode(您收到的)。

【讨论】:

以上是关于带有 OpenIdConnect 外部身份提供者的 Keycloak的主要内容,如果未能解决你的问题,请参考以下文章

带有外部身份提供者的 Keycloak 失败

IdentityServer3 和通过 OpenIDConnect 进行外部登录

IdentityServer 4,OpenIdConnect 重定向到外部登录 url

带有 WSO2 身份服务器的 Spring Cloud Security

如何在 Keycloak 中创建客户端以与 AWS Cognito 身份联合使用

OpenIdConnect 从 OpenId 提供者验证 jwt