使用Omniauth从RubyonRails上的Keycloft获取ID令牌以实现注销



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

根据这里的文件。我应该将用户重定向到此url并提供查询参数。但是,我希望在没有提示的情况下实现注销,并使用post_logout_redirect_uri将用户重定向回应用程序。要做到这一点,我需要提供id_token_hint参数,但这个令牌是什么以及如何获得它?我的密钥斗篷身份验证只返回访问令牌和刷新令牌,而不返回id令牌。我已经尝试在这个参数上同时使用这两种方法,但它不起作用。我在网上搜索到,ID令牌和访问令牌似乎不同。

我已经用omnauth和omnauth-keycapt-gem实现了对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"
})

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

我缺少什么?

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

我从这里得到的关键信息。然后通过读取omniauth密钥斗篷源代码。它依赖于omniauth-oauth2-gem。在阅读该源代码后,我发现您可以在初始化提供程序时提供scope参数。所以提供的应该像这个一样初始化

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令牌由Key斗篷返回,并且可以为注销id_token_hint参数提供。这样,用户就可以在没有提示的情况下注销。