正确的退出方式是什么?
这些是 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.......
OIDC 标准(由 Keycloak 实现)支持RP 发起的注销。因此,使用正确的注销参数将浏览器重定向(不仅仅是 XMLHttpRequest 请求)到
end_session_endpoint
。
顺便说一句:
end_session_endpoint
与revocation_endpoint
不同;注销!=撤销。
但这只是 OIDC 注销(从 Keycloak 注销)。您可能仍然拥有自己的应用程序会话(这取决于应用程序实现),因此应用程序需要销毁应用程序会话(“删除客户端上的刷新令牌”,...)才能从应用程序注销。
解决方案是调用以下网址:
http://localhost:8180/auth/realms/REALM/protocol/openid-connect/logout?id_token_hint=InR5cCIgOiAiSldUIiwia2lkIiA6ICIxUVJwMXAtbmk1WmcyZmlyRHFoRS1iS1hwemZDaWFocGs4Zi1XRkQtRDZ3In0.eyJleHAiOjE2NDE3NjUyNjYsImlhdCI6MTY0MTc2.......
/编辑这适用于非 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 的服务上的路由。