SELECT app_id, scope FROM oauth_client WHERE app_id = 'calendar-sync';
UPDATE oauth_client SET scope = 'contacts:read' WHERE app_id = 'calendar-sync';

装了一个日程同步应用,授权页只有一句获取你的基本信息,同意后在它的控制台能看到全公司 1200 个员工的姓名和部门。授权记录里 scope 写着 contacts:read,contacts:write,employee:all。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,应用注册时把所有 scope 一次性申请下来,前端只渲染了第一个中文名,剩下的没有展示。用户看到的授权范围和实际拿到的权限不是一回事。

这次卡住的地方就在「OAuth 授权范围过大」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:按最小必要申请 scope 用不到的从应用注册里去掉;授权页逐条列出每个 scope 和对应数据范围;后台提供已授权应用列表 支持随时撤销。

改完只确认一件事:重新授权后页面只列出 1 条权限,应用再读 employee:all 返回 403 insufficient_scope。

作者 9823189