当前位置: 首页 > 知识库问答 >
问题:

通过Keycloak REST API注销用户无效

顾淳
2023-03-14

我在从(移动)应用程序调用KeyCloak注销endpoint时遇到问题。

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

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

注销endpoint注销经过身份验证的用户。

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

endpoint也可以由应用程序直接调用。要直接调用此endpoint,需要包括刷新令牌以及对客户端进行身份验证所需的凭据。

我的请求有以下格式

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)。

我的要求是基于这个钥匙斗篷的问题。这个问题的作者使它工作,但它不是我的情况。

我用的是钥匙斗篷3.2.1.最终版。

你也有同样问题吗?你知道怎么解决它吗?

共有1个答案

祁刚毅
2023-03-14

最后,我通过查看keycloak的源代码找到了解决方案:https://github.com/keycloak/keycloak/blob/9cbc335b68718443704854b1e758f8335b06c242/services/src/main/Java/org/keycloak/protocol/oidc/endpoints/logoutendpoint.#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>

应正确销毁会话。

 类似资料:
  • 用户无法注销Firebase Android。当我按注销按钮时,它不会注销。 代码在这里:- 日志包括: 02-13 23:54:19.654 307 3-3073/com.example.imran.bloodgenders i/view:Touch down dispatch to android.widget.button{42d3afa0 vfed..........120,594-600

  • 我正在用Firebase设置身份验证。我成功登录了,但当我注销时,我的应用程序崩溃了 我在activity_menu上创建菜单。菜单项名为log_out。如果用户单击此项,则必须注销 我尝试这段代码查看错误,但它没有显示给我 我以为它是成功运行的,我没有看到任何错误。我怎么知道呢?

  • 为了在实现过程保持完整自然流畅的功能,我们还添加注销视图,编辑urls.py以添加新的路由: myproject/urls.py from django.conf.urls import url from django.contrib import admin from django.contrib.auth import views as auth_views from accounts im

  • 只是一个关于Spring Security性和会话失效的问题。 当会话被ConcurrentSessionControlStrategy无效时,会话将通过调用removeSessionInformation方法从SessionRegistry中移除;然而,当会话被手动注销无效时,HttpSession也会无效,但不会调用SessionRegistry从那里移除条目。 我添加了HttpSession

  • 所以这里我有通过本地存储令牌的登录功能。我在开发工具/应用程序中创建用户时获得令牌,它将我重定向到正在工作的家庭。不起作用的是这个。创建一个用户,它正在工作,但当它加载时,它应该显示logout而不是login,并且应该隐藏购物车组件。我在哪里犯了一个错误上下文Api 登录链接 标题 登录组件

  • 我通过在自定义登录API中生成JWT(JSON Web Token)在Azure移动服务中使用自定义身份验证。一旦用户拥有JWT,它将一直有效,直到达到其编码的过期时间。 除了在每个经过身份验证的请求上根据会话表显式检查JWT令牌之外,是否有办法在JWT令牌到期之前使其失效(当用户注销时会发生这种情况),以便任何后续使用该令牌作为头中的值发出的请求都不会到达任何表API或自定义API脚本?