如何通过编程方式撤销已注册应用的用户授权?
如何通过编程方式撤销已注册应用的用户授权?
我太懂你这种头疼的感觉了——用户点了“取消关联”,不仅要清理自己数据库里的用户数据、事件和钩子,还得让应用彻底从用户的权限管理列表里消失,之前试了各种API都碰钉子,确实让人抓狂。结合你用Microsoft Graph权限的场景,我给你梳理一套能彻底解决问题的步骤,还有之前可能踩过的坑:
首先,先确认你有足够的操作权限
这是很多人失败的根源!要操作用户的权限授予和会话,你的应用需要拿到对应的权限:
- 如果是**以用户的身份(交互式令牌)**执行操作:需要申请
Directory.AccessAsUser.All委托权限(这个权限用户自己就能同意,不需要管理员审批)。 - 如果是**后台服务(应用身份)**执行操作:需要申请
DelegatedPermissionGrant.ReadWrite.All或者User.ReadWrite.All的应用权限(这个需要管理员同意)。
两步走实现彻底撤销
1. 先失效用户的所有刷新令牌(防止后续越权访问)
调用revokeSignInSessions API,把用户当前所有的刷新令牌都废掉,这样就算你之前存了令牌,也没法再获取新的访问令牌了:
POST /users/{user-id}/revokeSignInSessions
这里的user-id可以用用户的Object ID或者UPN(用户主体名称,比如xxx@domain.com),推荐用Object ID,避免邮箱变更的问题。
2. 删除用户给你的应用的权限授予记录(关键!让应用从列表消失)
这一步才是让应用从用户权限管理页面消失的核心操作:
- 先查询用户名下所有的权限授予记录,筛选出属于你的应用的那条:
返回结果里,找到GET /users/{user-id}/oauth2PermissionGrantsclientId等于你的应用ID的那条记录,记下它的id(也就是grant-id)。 - 然后调用删除接口干掉这条记录:
DELETE /oauth2PermissionGrants/{grant-id}
那些容易踩的坑
- 权限不够就瞎调用:之前你用的
Calendars.ReadWrite这类权限只能操作日历,根本没权限碰权限授予记录,所以一定要确保调用API的令牌包含我上面说的权限。 - 找错了grant-id:有些用户可能给多个应用授权,一定要严格筛选
clientId等于你的应用ID的记录,别删错了。 - 混淆了应用身份和用户身份:如果是用户在你的应用里主动取消关联,用用户当前的令牌(带
Directory.AccessAsUser.All)操作最直接,不需要后台服务介入。
执行完这两步,用户再去权限管理页面,你的应用就彻底消失了,同时所有的访问权限也被收回,完美实现你要的“彻底清理”效果。
备注:内容来源于stack exchange,提问作者Marko Gasparic
相关产品推荐
相关产品推荐

