身份与授权 · 已有客户端迁移

已有客户端迁移

如果你的应用已实现标准 OIDC 客户端(授权码 + PKCE + state / nonce),目前连接其他身份服务,迁到本平台通常 只需改配置,无需改动代码。本页说明迁移可行的原因与注意事项。

适用场景:应用已具备"授权码流程 → 换 token → 调 userinfo 获取用户信息"的标准实现。

为什么能只改配置#

本平台的协议端点与主流 OIDC 服务同构,标准客户端库(openid-client、requests-oauthlib、各语言 SDK)均按发现端点或显式 URL 配置工作。若你的实现满足以下条件,迁移等同于更换三个端点 URL 与一组凭据:

  1. 授权码流程带 PKCE,或至少带 state 校验;
  2. 通过 userinfo 端点获取用户信息,而非依赖某 IdP 特有的字段;
  3. 回调地址固定且可精确配置。

迁移步骤#

1. 取得本平台凭据#

按接入指南创建应用,取得 client_id 与 client_secret(secret 仅在创建时显示一次)。

2. 修改配置#

配置项原值新值
授权端点原 IdP 的 /authorizehttps://mooc.pneumas.org/oauth/authorize
令牌端点原 IdP 的 /tokenhttps://mooc.pneumas.org/oauth/token
用户信息端点原 IdP 的 /userinfohttps://mooc.pneumas.org/oauth/userinfo
发现端点(可选)原 IdP 的 discoveryhttps://mooc.pneumas.org/.well-known/openid-configuration
client_id / client_secret原凭据本平台凭据
scope原值(通常已含 openid profile email)保持不变,按需追加 group、member_groups

3. 核对字段映射#

本平台 userinfo 返回标准字段:

字段用途
sub用户 ID 字符串,作为本地用户主键(稳定,不随改名变化)
name显示名
preferred_username用户名
email / email_verified邮箱与验证状态
picture头像
group(申请该 scope 时)绑定群的成员身份与角色
member_groups(申请该 scope 时)用户在群内的全部应用成员组

若原实现从 userinfo 读取的是自定义字段名(如 id、user_login),迁移时将字段映射改为上表即可。

权益联动(可选)#

应用的高级功能可对应平台群里的 应用成员组(成员组),两侧双向同步:

① 登录方向(平台 → 应用)
   用户登录 → 应用调 userinfo(scope 含 member_groups)
   → 取得应用成员组 → 映射为应用的功能开关

② 管理方向(应用 → 平台)
   用户升级 / 降级 → 应用服务器用 client_credentials 调应用成员组管理 API
   → 将该用户加入 / 移出对应应用成员组 → 平台同步课程权益
   → 用户下一次刷新 userinfo 即看到新应用成员组

实现上:登录请求的 scope 带上 member_groups;创建应用时勾选 client_credentials(获得 members:read + member_groups:write);在升级 / 降级逻辑中调用 POST /oauth/members/{user_id}/member-groups/{group_id} 或 /move。

管理 API 只能操作 已是群成员 的用户。被移出群的用户只能展示访客状态,不能通过 API 重新加回群——加人进群是群管理员在平台侧的操作。

迁移后验证清单#

  • 用户用平台账号登录应用成功,显示名与头像正确;
  • 用不在绑定群内的平台账号登录,userinfo 返回 is_member=false,应用显示访客视图;
  • 将用户移出群后,其在应用的会话于下次刷新时失效(invalid_grant);
  • 应用通过管理 API 将用户加入"高级会员"应用成员组后,平台群管理页面可见;
  • 用户撤销对该应用的授权后,应用侧立即失去该用户。