You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过API让用户删除自己的Keycloak 18.0.2账户?

问题

我有一个Express.js CRUD应用,用Keycloak 18.0.2做身份管理,Keycloak负责Google和Facebook的SSO,所有认证都通过Keycloak完成,当前用户通过HTTP请求里的访问令牌认证。

我想实现无需管理员权限,用户可删除自身账户的功能:用户给我的Express.js应用发DELETE请求,我先删应用内的用户记录,再用收到的访问令牌调用Keycloak的删除API。

我试过以下方法都没成功:

  1. 网上说要在Keycloak的“Account”标签启用“Self-Service Account Management”,但Keycloak 18.0.2里找不到这个标签和选项;
  2. 向https://my-keycloak/auth/realms/my-realm/account发DELETE请求,返回404错误:
{
  "error": "RESTEASY003210: Could not find resource for full path:http://your-keycloak-server/auth/realms/your-realm-name/account"
}
  1. 向https://my-keycloak/realms/my-realm/account发DELETE请求,返回405错误:
{
  "error": "RESTEASY003650: No resource method found for DELETE, return 405 with Allow header"
}

想请教:

  • 怎么让用户用自己的访问令牌删除Keycloak账户?
  • 有没有允许用户删除自身账户的Keycloak Admin API端点?有的话怎么访问?
  • 如果上述方法不行,有哪些安全的替代方案?

解决方案

一、用用户自身访问令牌删除Keycloak账户的正确方式

Keycloak 18.0.2的Account API不支持DELETE方法,但可以通过Admin API结合细粒度权限配置实现用户自删,步骤如下:

  1. 配置客户端与权限
    • 登录Keycloak管理控制台,进入目标my-realm
    • 找到你的Express应用对应的客户端,进入「Client scopes」标签,添加内置的roles作用域,确保访问令牌能携带用户角色信息
    • 开启客户端的「Authorization」功能,进入该标签后:
      • 选择「Users」资源类型,创建新权限,设置权限条件为user.id == context.authentication.token.sub(限制用户只能操作自己的账户)
      • 给用户分配该权限(可通过默认角色自动批量分配)
  2. 调用Admin API执行删除
    用户的访问令牌需包含realm-management客户端的delete-users角色(或自定义权限),然后调用以下端点:
    DELETE /admin/realms/my-realm/users/{user-id}
    
    其中{user-id}可从用户访问令牌的sub字段获取,请求头带上令牌:
    Authorization: Bearer {user-access-token}
    

二、Keycloak Admin API端点说明

确实存在支持删除用户的Admin API端点,但默认仅管理员可调用,需通过权限配置开放给普通用户:

  • 端点:DELETE /admin/realms/{realm}/users/{id}
  • 访问要求:
    1. 访问令牌需包含realm-management客户端的delete-users角色(或自定义权限)
    2. 通过权限策略严格限制用户只能删除ID与自身sub字段匹配的账户

三、安全替代方案

如果不想配置Admin API权限,可选择以下两种方案:

  1. 注销+后端标记删除
    • 用户发送DELETE请求到Express应用后,先删除应用内的用户记录,再调用Keycloak的注销API让用户无法再登录:
      POST /realms/my-realm/protocol/openid-connect/logout
      
      请求参数带上用户的刷新令牌即可完成注销
    • 后续通过管理员令牌调用Admin API批量标记用户为disabled,或定时清理已注销的账户
  2. 后端用服务账户代理删除
    • 在Keycloak创建一个具有delete-users权限的服务账户,获取其长期令牌并妥善存储在Express应用后端
    • 用户发送DELETE请求时,先验证用户访问令牌的合法性并提取用户ID,再用服务账户的管理员令牌调用Admin API删除该用户
    • 优点:无需给普通用户分配敏感权限;缺点:需严格保管服务账户令牌,避免泄露

内容的提问来源于stack exchange,提问作者suplesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:37:35