身份与授权 · Scope 与权限

Scope 与权限

Scope(权限范围)是授权的最小单位。应用申请哪些 scope,同意页就向用户列出哪些信息,平台就只签发哪些 scope。平台按"申请 ∩ 获批"签发:请求的 scope 必须是应用获批 scope 的子集,未获批的不会出现在 token 与 userinfo 中。

身份与群信息#

授权码流程可用的 scope:

scope含义userinfo 字段
openidOIDC 标识,触发签发 id_token触发 id_token
profile基础资料name、preferred_username、picture
email邮箱email、email_verified
group群成员身份与角色group 对象:is_member、role、群 id / slug / name
member_groups应用成员组member_groups 数组:用户在该群的全部应用成员组

管理权限#

client_credentials 流程专用的 scope,不能出现在授权码流程中:

scope含义可调用的端点
members:read读取群成员与应用成员组GET /oauth/members、GET /oauth/member-groups
member_groups:write管理应用成员组与成员分配应用成员组 CRUD、成员加 / 移 / 移动应用成员组

身份 scope 与管理 scope 分属两套白名单,互不交叉:授权码流程不会签发管理 scope,client_credentials 不会签发身份 scope。client_credentials 换得的 token 不含 refresh_token,到期后需重新换取。

申请时的选择#

应用需求应选 scope
只需登录openid profile email
需判断"是否群成员 / 群内角色"追加 group
需按应用成员组展示内容追加 member_groups
应用服务器需维护群成员应用成员组勾选 client_credentials,自动获得 members:read 与 member_groups:write

这里有两套彼此独立的能力:普通用户在平台 UI 中是否看得到「应用成员组」页签,取决于站点管理员 / 教师的教学群组管理资格;应用服务器使用绑定该群的 client_credentials 管理 API,则不要求群创建者本人具有教师角色。管理 API 只能维护已有群成员的应用成员组,不能替代平台群组管理把用户拉入群。

原则是只申请必要 scope。申请越多,同意页列出的信息越多,用户拒绝的可能性越高;平台也按获批集合严格签发,多申请不会多给。

签发规则#

  1. 授权码流程:请求 scope 必须 ⊆ 应用获批 scope(获批集合 = 创建应用时勾选的 scope)。
  2. client_credentials:请求 scope 必须 ⊆ 应用获批管理 scope ∩ 管理白名单。
  3. token 响应中的 scope 字段为实际授予值,以此为准。
  4. userinfo 按 token 的 scope 过滤字段,未获批的字段不出现在响应中。

例如应用只获批 openid email,即便用户在授权 URL 中手动拼入 scope=openid profile email group,authorize 会以 invalid_scope 拒绝,流程终止。

应用成员组(member_groups)#

  • member_groups 返回用户在当前群的 全部 成员组。
  • 新成员加入群时自动进入群的默认成员组,因此数组通常至少有一个元素。
  • 数组元素字段:{ id, name, description, is_default, sort }。
  • 应用成员组与群角色独立:角色(creator / admin / member)管群管理权,应用成员组管内容可见性。

示例(用户同时属于默认成员组与"高级会员"):

"member_groups": [
  { "id": 11, "name": "默认成员组", "description": "新成员加入群组时自动进入此成员组", "is_default": true, "sort": 0 },
  { "id": 12, "name": "高级会员", "description": "可访问进阶内容", "is_default": false, "sort": 1 }
]

撤销#

  • 用户撤销:用户撤销对某应用的授权后,该应用名下该用户的全部 token 立即吊销,下一次刷新必然失败,用户再次登录时重新看到同意页。
  • 管理员禁用:平台管理员在后台禁用应用后,该应用的全部 token 立即吊销,所有用户同时失去访问。恢复由管理员在后台操作。