当前位置: 首页 > 知识库问答 >
问题:

Keyclope刷新外部IDP令牌

惠诚
2023-03-14

我们正在使用keyclope身份代理将身份验证联合到外部IDP。标识提供程序的类型为OpenID Connect v1.0。此外,我们正在PKCE中使用OIDC授权代码流。

我们能够根据以下留档成功地从外部IDP中检索令牌:https://www.keycloak.org/docs/latest/server_admin/#retrieving-external-idp-tokens

但是,当使用用户代理授予的“refresh\u token”刷新KeyClope令牌时,外部IDP中的令牌不会被刷新。在这个主题上,keybeapt提供的文档非常少。

有人知道如何从外部IDP刷新令牌吗?

最新消息:我已经向Keyclope社区发布了一个问题https://github.com/keycloak/keycloak-community/issues/277

共有2个答案

麻华辉
2023-03-14

@Hawk提出的解决方案引用了一种不同的API-令牌交换-它可以用于检索(甚至伪造)KeyClope上的令牌。在您可以交换的所有不同令牌中,您可以从配置的身份提供程序中检索令牌,这也是我们最终使用的。

长话短说,您正在使用的“检索外部IDP令牌”功能不会为您刷新令牌:如果您计划使用它,您必须检索刷新令牌并自己生成新的访问令牌,这很不幸,因为这将迫使您在应用程序上拥有身份提供器的客户端/机密ID。

Token Exchange API将改为为您刷新令牌。您可以通过发出此请求轻松检索IP访问令牌(示例使用python,您显然可以使用任何其他语言):

    response = requests.post(
        f"{ID_PROVIDER_HOST}/auth/realms/{REALM}/protocol/openid-connect/token",
        data={
            "client_id": CLIENT_ID,
            "client_secret": CLIENT_SECRET,
            "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
            "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
            "requested_issuer": IDENTITY_PROVIDER_ALIAS,
            "subject_token": access_token,
        },
    )

不过,您需要一些配置:首先,从当前的Keyclope版本(17)开始,令牌交换处于“技术预览”中,默认情况下不启用;请参阅Keyclope文档以了解如何启用它。

然后,您需要允许客户端交换IP令牌:从您领域的管理面板:

  • 从侧栏中选择“身份提供者”
柳景胜
2023-03-14

Keyclope保留来自上游IdP的访问令牌和刷新令牌。执行令牌交换时,如果访问令牌已过期,但刷新令牌尚未过期,则会刷新令牌,如下所示:https://github.com/keycloak/keycloak/blob/master/services/src/main/java/org/keycloak/broker/oidc/OIDCIdentityProvider.java#L186-L187

最重要的是,您需要比外部刷新令牌过期更频繁地调用令牌交换endpoint。根据您的实现,您可以通过多种方式利用这一点。例如,我已将我的访问令牌ttl设置为比外部IdP的刷新令牌ttl短,并且我有一个机密客户端,它在每次看到新的访问令牌时都会调用令牌交换endpoint,这不是最好的解决方案,但它比刺眼的棍子要好。

我不知道为什么当你对你的keydropeat造币令牌进行令牌刷新时,keydropeat开发人员不只是刷新任何外部令牌。他们都是聪明人,所以我相信这是有原因的,但到目前为止我还没有弄明白。我一直在考虑扩展现有的OIDCIdentityProvider来做到这一点,但在我了解自己的情况之前,我宁愿不打开那罐蠕虫。如果有人有任何见解,我将不胜感激。

 类似资料:
  • 如何禁用外部IDP的用户名/密码登录? 我知道我可以使用自定义主题来隐藏超文本传输协议表单,但我想正确地这样做。 据我所知,我必须至少创建自定义First Broker登录和浏览器身份验证流程,对吗? 在第一次从IDP登录之后,我必须在Keyclope中创建用户,但不要使用密码选项。 此外,浏览器流必须更新为不显示用户名/密码表单,对吗? 有人能提供适当的例子吗? 谢啦

  • 现在我有了我的应用程序将嵌入另一个CRM平台的用法。假设这个CRM平台使用IDP1。因此,用户能够访问CRM,并将通过IDP1进行身份验证。然后,用户可以点击一个按钮,并被引导到我的应用程序。当然,我们不希望用户再次使用相同的IdP进行身份验证,但现在首先通过KeyCloak进行身份验证。 我的问题是,有没有一种方法让Keycloak使用用户访问CRM平台时收到的IDP1令牌,让Keycloak充

  • 授权服务器可以给Web应用客户端和本机应用程序客户端颁发刷新令牌。 刷新令牌在传输和储存时必须保持机密性,并只与授权服务器和刷新令牌被颁发的客户端共享。授权服务器必须维护刷新令牌和它被颁发给的客户端之间的绑定。刷新令牌必须只能使用带有RFC2818定义的服务器身份验证的1.6所述的TLS 传输。 授权服务器必须验证刷新令牌和客户端身份之间的绑定,无论客户端身份是否能被验证。当无法进行客户端身份验证

  • 刷新令牌是用于获取访问令牌的凭据。刷新令牌由授权服务器颁发给客户端,用于在当前访问令牌失效或过期时,获取一个新的访问令牌,或者获得相等或更窄范围的额外的访问令牌(访问令牌可能具有比资源所有者所授权的更短的生命周期和更少的权限)。颁发刷新令牌是可选的,由授权服务器决定。如果授权服务器颁发刷新令牌,在颁发访问令牌时它被包含在内(即图1中的步骤D)。 刷新令牌是一个代表由资源所有者给客户端许可的授权的字

  • 我对oauth2中的刷新令牌有点困惑。如它所说的访问令牌限制了黑客可以使用用户凭证的1小时的时间窗口,刷新令牌是万岁令牌,可以用来重新创建访问令牌。 我很困惑,如果有人从cookie中窃取了访问令牌,他也可以窃取刷新令牌,并可以使用刷新令牌创建新的访问令牌,因为我在JQuery中有ajax请求(客户端)

  • 我在自己的Web API上使用Oauth2,在Web应用程序上使用ASP.NET C#来使用该API。在我的web应用程序上,我正在进行HttpWebRequests。当我的访问令牌过期时,我调用一个方法“refreshToken”,该方法发出请求以获取新的访问令牌。这工作很好,没有问题...除了我得到的响应包含一个新的刷新令牌???我在等新的访问令牌。我甚至认为在没有再次传递凭据的情况下这是不可