通过 pkce 进行身份验证后从 keycloak 注销的最佳方法是什么?

问题描述 投票:0回答:3

正确的退出方式是什么?

这些是 keycloak 客户端设置:

Realm: REALM

Client ID:              pkce-client
Client Protocol:        openid-connect
Access Type:            public
Standard Flow Enabled:  ON
Valid Redirect URIs:    http://localhost:4200/
Backchannel Logou:      ON

OpenID Connect 兼容模式

Use Refresh Tokens: ON 

高级设置:

Proof Key for Code Exchange Code Challenge Method: S256

有好的文档吗?

我的想法是删除客户端的令牌,但随后会话在 keycloak 中仍然处于活动状态。

解决方案是调用以下网址:

http://localhost:8180/auth/realms/REALM/protocol/openid-connect/logout?id_token_hint=InR5cCIgOiAiSldUIiwia2lkIiA6ICIxUVJwMXAtbmk1WmcyZmlyRHFoRS1iS1hwemZDaWFocGs4Zi1XRkQtRDZ3In0.eyJleHAiOjE2NDE3NjUyNjYsImlhdCI6MTY0MTc2.......
keycloak openid-connect logout pkce
3个回答
5
投票

OIDC 标准(由 Keycloak 实现)支持RP 发起的注销。因此,使用正确的注销参数将浏览器重定向(不仅仅是 XMLHttpRequest 请求)到

end_session_endpoint

顺便说一句:

end_session_endpoint
revocation_endpoint
不同;注销!=撤销。

但这只是 OIDC 注销(从 Keycloak 注销)。您可能仍然拥有自己的应用程序会话(这取决于应用程序实现),因此应用程序需要销毁应用程序会话(“删除客户端上的刷新令牌”,...)才能从应用程序注销。


1
投票

解决方案是调用以下网址:

http://localhost:8180/auth/realms/REALM/protocol/openid-connect/logout?id_token_hint=InR5cCIgOiAiSldUIiwia2lkIiA6ICIxUVJwMXAtbmk1WmcyZmlyRHFoRS1iS1hwemZDaWFocGs4Zi1XRkQtRDZ3In0.eyJleHAiOjE2NDE3NjUyNjYsImlhdCI6MTY0MTc2.......

0
投票

/编辑这适用于非 PCKE,其中访问和刷新令牌存储在 cookie 中:

您可以创建一个注销服务后端,并在所有服务的 /logout 端点上提供该后端。

当服务被调用时,它首先获取用于连接的客户端的ID令牌:

curl -k  https://<keycloak-host>/auth/realms/<realm>/protocol/openid-connect/token \
  -d "grant_type=client_credentials" \
  -d "client_id=<client-id>" \
  -d "client_secret=<secret>" \
  -d "scope=openid"

请参阅此答案

然后它根据用户的主机以如下格式构造一个重定向 URL:

https://?cache-buster=1445660571

带有可选的缓存破坏器。

按照以下格式创建到授权服务器的重定向 URL:

https:///auth/realms//protocol/openid-connect/logout?id_token_hint=&post_logout_redirect_uri=

然后创建状态代码为 303(请参阅其他)的响应,其中位置为上面构建的 URL,并将“kc-access”、“kc-state”、“OAuth_Token_Request_State”和“request_uri”cookie 设置为过期作为标头。 Clojure 示例:

(defn- expired-cookie [host cookie-name]
  (str cookie-name "=; "
       "domain=." host "; "
       "path=/; "
       "expires=Thu, 01 Jan 1970 00:00:00 GMT; "
       "HttpOnly"))

响应示例:

status: 303
headers: 
{"Location" "https://<keycloak host>/auth/realms/<realm>/protocol/openid-connect/logout
?id_token_hint=<id token you obtained>
&post_logout_redirect_uri=<url encoded redirect URL>"
 "Set-Cookie" 
["kc-access=; domain=.https://<domain>; path=/; 
  expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly"
 "kc-state=; domain=.https://<domain>; path=/; 
  expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly"
 "OAuth_Token_Request_State=; domain=.https://<domain>; path=/; 
  expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly"
 "request_uri=; domain=.https://<domain>; path=/; 
  expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly"]}

此返回的响应将注销用户并重定向到构造的重定向 URL(例如,用户来自哪里)。

此 /logout 端点可用作所有使用 Keycloak 的服务上的路由。

© www.soinside.com 2019 - 2024. All rights reserved.