凭据与管理#
Q:client_secret 丢失怎么办?
在应用列表点"重置 Secret"自助重发。新值只显示一次,旧值立即失效,需同步更新到应用服务器。平台只存哈希,无法查询明文。
Q:一个应用能绑定多个群吗?
不能。当前一个应用绑定一个群,多群需求出现时再评估扩展。
Q:应用被管理员禁用后能恢复吗?
能。由平台管理员在后台启用即可,恢复后用户需重新授权或刷新。禁用通常因发现滥用,恢复前应先与管理员确认原因。
Q:修改 scope 或回调地址需要重新创建应用吗?
不需要。在群管理"接入应用"页签编辑应用即可。回调与 scope 的变更对新发起的授权生效,已签发的 token 不受影响。
协议与安全#
Q:为什么 access token 是不透明串而不是 JWT?
为了可吊销。JWT 在吊销前始终有效,不透明 token 每次校验都查库,使管理员禁用、用户撤销、移出群等操作能即时生效。id_token 是 JWT(RS256),用于应用侧验签身份,但不含群与应用成员组——这些始终走 userinfo。
Q:refresh_token 何时失效?
三种情况:① 30 天到期;② 被轮换(每次刷新旧 refresh 作废,签发新 refresh);③ 重查失败——应用被禁用、绑定群被删、用户被移出群。第 ③ 种是"移出群即失去访问"的实现机制。
Q:code 能重放吗?
不能。code 单次使用、10 分钟过期,且必须与原 client_id、原 redirect_uri 配对。换 token 时需携带 code_verifier(PKCE),截获 code 的人没有 verifier 无法使用。
Q:id_token 如何验签?
从 GET /oauth/jwks 取公钥(按 kid 匹配),用 RS256 验签,再校验 iss(等于 https://mooc.pneumas.org)、aud(等于你的 client_id)与 exp。主流 JWT 库均有现成 API。
Q:能通过 OAuth 读取平台的课程或帖子吗?
不能。本平台是纯身份提供方,OAuth 只给"身份 + 群 + 应用成员组"。读取课程等内容需等平台开放内容 API(后续服务)。
成员与应用成员组#
Q:为什么普通群创建者在平台 UI 里看不到「应用成员组」页签?
「应用成员组」页签是教学群组管理功能,只对站点管理员,或同时具备教师角色且为该群有效创建者 / 管理员的用户开放。这不影响已接入应用使用绑定群的 client_credentials 管理 API;应用服务器可以维护已有成员的应用成员组,但不能通过 API 把用户拉入群。
Q:应用能自己把用户拉进群吗?
不能。管理 API 只能操作已有群成员的应用成员组。把新人加进群是群创建者 / 管理员在平台侧的操作。这是有意的边界:群成员名单的变更权在群,不在应用。
Q:用户属于多个应用成员组时 userinfo 如何返回?
全部返回(member_groups 数组)。应用按需处理,例如命中"高级会员"即解锁高级功能,不要求用户只持有一个应用成员组。
Q:用户撤销授权后,应用应如何处理?
该用户在应用里的全部 token 已吊销,刷新必然失败。应用应将此类失败视为"用户已注销",清理本地会话并引导重新登录。
发布#
Q:有官方 SDK 吗?
没有。本平台是标准 OIDC,直接使用所用语言的 OIDC 客户端库即可(Python requests-oauthlib、Node openid-client 等)。
Q:userinfo 返回 401,但 token 刚换不久?
access token 已过期(1 小时),或被吊销(用户撤销 / 管理员禁用)。用 refresh_token 换新 token。
