通过Keycloak REST API注销用户不起作用

曼河:

从(移动)应用程序调用Keycloak的注销端点时出现问题

支持此方案,如其文档中所述

/ realms / {realm-name} / protocol / openid-connect / logout

注销端点注销已认证的用户。

可以将用户代理重定向到端点,在这种情况下,活动用户会话将被注销。之后,将用户代理重定向回应用程序。

端点也可以由应用程序直接调用。要直接调用此端点,需要包括刷新令牌以及认证客户端所需的凭据

我的请求具有以下格式:

POST http://localhost:8080/auth/realms/<my_realm>/protocol/openid-connect/logout
Authorization: Bearer <access_token>
Content-Type: application/x-www-form-urlencoded

refresh_token=<refresh_token>

但是总是会发生此错误:

HTTP/1.1 400 Bad Request
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/10
Content-Type: application/json
Content-Length: 123
Date: Wed, 11 Oct 2017 12:47:08 GMT

{
  "error": "unauthorized_client",
  "error_description": "UNKNOWN_CLIENT: Client was not identified by any client authenticator"
}

如果我提供了access_token,似乎Keycloak无法检测到当前客户端的身份事件我使用相同的access_token可以毫无问题地访问其他Keycloak的API,例如userinfo/ auth / realms // protocol / openid-connect / userinfo)。

我的请求基于此Keycloak的问题问题的作者认为它起作用了,但这不是我的情况。

我正在使用Keycloak 3.2.1.Final

你有同样的问题吗?你有解决的办法吗?

曼河:

最后,我通过查看Keycloak的源代码找到了解决方案:https : //github.com/keycloak/keycloak/blob/9cbc335b68718443704854b1e758f8335b06c242/services/src/main/java/org/key/ak/keycloak/protocol/oidc/endpoints/ LogoutEndpoint.java#L169它说:

如果客户端是公共客户端,则必须包括“ client_id”表单参数。

所以我所缺少的是client_id表单参数。我的要求应该是:

POST http://localhost:8080/auth/realms/<my_realm>/protocol/openid-connect/logout
Authorization: Bearer <access_token>
Content-Type: application/x-www-form-urlencoded

client_id=<my_client_id>&refresh_token=<refresh_token>

该会话应正确销毁。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章