我一直在努力实现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
参数提供。这样,用户就可以在没有提示的情况下注销。