如何通过API让用户删除自己的Keycloak 18.0.2账户?
问题
我有一个Express.js CRUD应用,用Keycloak 18.0.2做身份管理,Keycloak负责Google和Facebook的SSO,所有认证都通过Keycloak完成,当前用户通过HTTP请求里的访问令牌认证。
我想实现无需管理员权限,用户可删除自身账户的功能:用户给我的Express.js应用发DELETE请求,我先删应用内的用户记录,再用收到的访问令牌调用Keycloak的删除API。
我试过以下方法都没成功:
- 网上说要在Keycloak的“Account”标签启用“Self-Service Account Management”,但Keycloak 18.0.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" }
- 向
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结合细粒度权限配置实现用户自删,步骤如下:
- 配置客户端与权限
- 登录Keycloak管理控制台,进入目标
my-realm - 找到你的Express应用对应的客户端,进入「Client scopes」标签,添加内置的
roles作用域,确保访问令牌能携带用户角色信息 - 开启客户端的「Authorization」功能,进入该标签后:
- 选择「Users」资源类型,创建新权限,设置权限条件为
user.id == context.authentication.token.sub(限制用户只能操作自己的账户) - 给用户分配该权限(可通过默认角色自动批量分配)
- 选择「Users」资源类型,创建新权限,设置权限条件为
- 登录Keycloak管理控制台,进入目标
- 调用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} - 访问要求:
- 访问令牌需包含
realm-management客户端的delete-users角色(或自定义权限) - 通过权限策略严格限制用户只能删除ID与自身
sub字段匹配的账户
- 访问令牌需包含
三、安全替代方案
如果不想配置Admin API权限,可选择以下两种方案:
- 注销+后端标记删除
- 用户发送DELETE请求到Express应用后,先删除应用内的用户记录,再调用Keycloak的注销API让用户无法再登录:
请求参数带上用户的刷新令牌即可完成注销POST /realms/my-realm/protocol/openid-connect/logout - 后续通过管理员令牌调用Admin API批量标记用户为
disabled,或定时清理已注销的账户
- 用户发送DELETE请求到Express应用后,先删除应用内的用户记录,再调用Keycloak的注销API让用户无法再登录:
- 后端用服务账户代理删除
- 在Keycloak创建一个具有
delete-users权限的服务账户,获取其长期令牌并妥善存储在Express应用后端 - 用户发送DELETE请求时,先验证用户访问令牌的合法性并提取用户ID,再用服务账户的管理员令牌调用Admin API删除该用户
- 优点:无需给普通用户分配敏感权限;缺点:需严格保管服务账户令牌,避免泄露
- 在Keycloak创建一个具有
内容的提问来源于stack exchange,提问作者suplesh
相关产品推荐
相关产品推荐

