【问题标题】:Obtain ID token from Keycloak on Ruby on Rails with Omniauth to implement logout使用 Omniauth 从 Ruby on Rails 上的 Keycloak 获取 ID 令牌以实现注销
【发布时间】:2022-11-11 00:07:03
【问题描述】:

我一直在努力实现注销到我的 Ruby on Rails 应用程序。我在端口 8081 上本地运行 Keycloak v19.0.2。因此领域test-realm 的注销 url 是 http://localhost:8081/realms/test-realm/protocol/openid-connect/logout。

根据文档here。我应该将用户重定向到这个 url 并提供查询参数。但是我想在没有提示的情况下实现注销并使用post_logout_redirect_uri 将用户重定向回应用程序。为此,我需要提供id_token_hint 参数,但是这个令牌是什么以及如何获取它?我的 Keycloak 身份验证只返回访问令牌和刷新令牌,而不是 id 令牌。我曾尝试在此参数上同时使用两者,但它不起作用。而我在网上搜索的,似乎 ID 令牌与访问令牌不同。

我已经使用omniauthomniauth-keycloak gems 实现了对我的Rails 应用程序的身份验证。例如,我按照以下方式定义 keycloak_openid 提供者

provider(:keycloak_openid,
         Secrets.keycloak_client_id,
         Secrets.keycloak_client_secret,
         name: "keycloak",
         client_options: {
             base_url: "", site: "http://localhost:8081", realm: "test-realm"
         })

我已经在我的路由中定义了一个回调,它将为我正确调用,在那里我可以获得访问令牌和刷新令牌。

我错过了什么?

【问题讨论】:

    标签: ruby-on-rails ruby keycloak omniauth logout


    【解决方案1】:

    好的,我似乎缺少从身份验证查询到令牌 api 的范围参数。因此,在请求令牌时,我需要向 Keycloak 提供 scope=openid 参数。这使得 Keycloak 返回 ID 令牌以及访问和刷新令牌。

    我从here 获得的关键信息。然后通过阅读omniauth-keycloak 源代码。这取决于omniauth-oauth2 gem。阅读该源代码后,我发现您可以在初始化提供程序时提供范围参数。所以提供的应该像这样初始化

    provider(:keycloak_openid,
             Secrets.keycloak_client_id,
             Secrets.keycloak_client_secret,
             name: "keycloak",
             scope: "openid",
             client_options: {
                 base_url: "", site: "http://localhost:8081", realm: "test-realm"
             })
    

    现在 ID 令牌由 Keycloak 返回并提供给注销 id_token_hint 参数。有了这个,用户可以在没有提示的情况下注销。

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 2013-05-01
      • 2012-09-16
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2016-06-27
      • 2016-07-14
      相关资源
      最近更新 更多