ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Open edX Studio 登录迁移至 OAuth2:Lilac 到 Maple 升级的 SSO 与 Session Cookie 分离指南

Open edX Studio 登录迁移至 OAuth2:Lilac 到 Maple 升级的 SSO 与 Session Cookie 分离指南 Open edX Studio 登录迁移至 OAuth2Lilac 到 Maple 升级的 SSO 与 Session Cookie 分离指南【免费下载链接】openedx-platformThe Open edX LMS Studio, powering education sites around the world!项目地址: https://gitcode.com/GitHub_Trending/ed/openedx-platform本文以仓库文档 docs/studio_oauth.rst 为骨架结合 Open edX 平台源码cms/envs、lms/envs与oauth_dispatch管理命令实现完整还原从 Lilac 到 Maple 升级中 Studio 登录从「共享 Session Cookie」迁移到「LMS OAuth2 单点登录」的全过程。读完本文你将掌握服务账号创建、OAuth2 客户端注册、LMS 登出联动与 Session Cookie 隔离的完整配置方法并理解每一处配置在源码层面的落地位置。一、背景为什么 Studio 登录必须迁移到 OAuth在 Lilac 版本及之前Studio 默认与 LMS 共享同一个 Session Cookie。这种设计带来了两个必然的部署约束二者必居其一强制 Studio 部署在 LMS 的子域之下才能继承父域 Cookie或者让 LMS 把 Session Cookie 设置在更宽泛的域名上如裸域以便 Studio 子域也能读取。后者意味着 Cookie 会被暴露给该域名下所有子域攻击面随子域数量线性扩大前者则牺牲了部署拓扑的灵活性。无论哪种方式登录态都被域捆绑安全性与灵活性不可兼得。Maple 版本的配置基线改为Studio 通过 LMS 的 OAuth2 授权码流程Authorization Code Grant完成单点登录。认证发生在 LMSStudio 只持有自己域下的独立 Session Cookie二者解耦既可以把 Studio 放到任何域名下又不必为跨子域共享而放宽 Cookie 作用域。但正如文档指出的这是一项迁移工作——如果配置不完整Studio 登录将直接不可用。二、迁移范围与前提迁移需要在每个部署环境stage、production 等分别完成唯一例外是 devstack 和 sandbox——它们会自动配置为 OAuth 模式见下文第五节。迁移的整体目标是两件事启用 OAuth 单点登录让 Studio 的登录动作委托给 LMS。分离 LMS 与 Studio 的 Session Cookie两者不再共享。需要特别提醒的是Session Cookie 分离意味着Studio 用户需要重新登录一次这是迁移的预期副作用应在变更窗口内提前告知用户。三、分步迁移指南按以下顺序在目标环境以 LMS 所在服务器为准Studio 配置写入 Studio 的环境变量/配置文件逐一执行。步骤 1在 LMS 中创建studio_worker服务账号Studio 的 OAuth 应用需要一个与之关联的本地用户。使用 Django 自带的manage_user管理命令创建并设置不可用密码确保该账号只能通过 SSO 体系使用、无法用密码直接登录./manage.py lms manage_user studio_worker some-emailyour-domain --unusable-password参数说明参数含义studio_worker服务账号用户名也是后面 OAuth 客户端的关联用户some-emailyour-domain该账号的邮箱替换为你的真实邮箱--unusable-password设置不可用密码禁止密码登录步骤 2在 LMS 中注册 SSO OAuth2 客户端使用 Open edX 自带的create_dot_application管理命令注册授权码类型authorization-code的 OAuth2 应用./manage.py lms create_dot_application \ --grant-type authorization-code \ --skip-authorization \ --redirect-uris https://studio.YOURSITE/complete/edx-oauth2/ \ --scopes user_id \ studio-sso studio_worker命令末尾的两个位置参数分别为应用名称studio-sso与关联用户studio_worker即步骤 1 创建的账号。从源码 openedx/core/djangoapps/oauth_dispatch/management/commands/create_dot_application.py 可以看到该命令支持的完整参数集参数源码位置作用--grant-typeadd_arguments中定义指定授权类型Studio SSO 必须为authorization-code--redirect-urisadd_argumentsdestredirect_uris回调地址多个用空格分隔--skip-authorizationadd_arguments跳过用户确认授权页服务间 SSO 通常开启--client-id/--client-secretadd_arguments手动指定客户端凭据不传则由系统自动生成--scopesadd_arguments逗号分隔的 scope 列表提供时还会创建oauth_dispatch的应用访问授权见_create_or_update_access将 scope 写入ApplicationAccess该命令在创建 OAuth2 应用的同时若指定了--scopes会同步创建对应 scope 的 Application Access 记录若应用已存在则执行更新逻辑。这也解释了为什么user_id这一 scope 必须显式声明——Studio SSO 完成回调后需要从 LMS 取回当前登录用户的身份信息。需要注意两点若仓库的迁移流程同时需要别的 scope如profile、email用逗号追加即可如--scopes user_id,profile--redirect-uris必须与你即将在步骤 4 中配置的SOCIAL_AUTH_EDX_OAUTH2_URL_ROOT对应的回调路径一致否则授权回调会被拒绝。步骤 3配置 LMS 登出时联动登出 Studio在 LMS 的配置中将 Studio 的公开登出地址加入IDA_LOGOUT_URI_LIST这样用户在 LMS 登出时LMS 会同时向列表中的各 IDA独立应用发起登出请求避免LMS 已登出、Studio 仍保持登录的状态割裂IDA_LOGOUT_URI_LIST: - https://studio.YOURSITE/logout/在 devstack 环境中这份配置的落地形态可以参考 lms/envs/devstack.py其中列表已包含 Studio 的登出地址IDA_LOGOUT_URI_LIST [ http://localhost:18130/logout/, # ecommerce http://localhost:18150/logout/, # credentials http://localhost:18381/logout/, # discovery http://localhost:18010/logout/, # studio ]步骤 4获取客户端凭据并配置 Studio 的 OAuth 参数在 LMS 的 Django Admin 中打开 OAuth2 应用管理页找到刚才注册的客户端/admin/oauth2_provider/application/?qstudio-sso记下该应用的Client ID与Client Secret然后在 Studio 的环境变量或配置文件中写入以下四个参数SOCIAL_AUTH_EDX_OAUTH2_KEY: client id SOCIAL_AUTH_EDX_OAUTH2_SECRET: client secret SOCIAL_AUTH_EDX_OAUTH2_URL_ROOT: server-to-server LMS root URL # 可能等同于公网 LMS 根地址 SOCIAL_AUTH_EDX_OAUTH2_PUBLIC_URL_ROOT: public LMS root URL各参数的作用参数作用取值建议SOCIAL_AUTH_EDX_OAUTH2_KEYOAuth2 客户端的 Client ID来自步骤 4 的 Admin 页面SOCIAL_AUTH_EDX_OAUTH2_SECRETOAuth2 客户端的 Client Secret来自步骤 4 的 Admin 页面生产环境务必使用高熵随机值SOCIAL_AUTH_EDX_OAUTH2_URL_ROOTLMS 的服务端到服务端根地址Studio 后端用它访问 LMS 的授权/令牌接口内网可达的 LMS 地址可能与公网地址相同SOCIAL_AUTH_EDX_OAUTH2_PUBLIC_URL_ROOTLMS 的公网根地址用于构造浏览器中的重定向用户浏览器可访问的 LMS 公网地址devstack 中这四个参数的示范值见 cms/envs/devstack.pySOCIAL_AUTH_EDX_OAUTH2_KEY studio-sso-key SOCIAL_AUTH_EDX_OAUTH2_SECRET studio-sso-secret # in stage, prod would be high-entropy secret SOCIAL_AUTH_EDX_OAUTH2_URL_ROOT ENV_TOKENS.get( SOCIAL_AUTH_EDX_OAUTH2_URL_ROOT, http://edx.devstack.lms:18000 ) SOCIAL_AUTH_EDX_OAUTH2_PUBLIC_URL_ROOT http://localhost:18000 # used in browser redirect注意源码注释中URL_ROOT与PUBLIC_URL_ROOT的语义差异前者是 Studio 服务端与 LMS 通信所用的内网根地址后者是浏览器重定向所用的公网根地址。在内外网分离的部署中两者往往不同若只有单一公网地址也可以相同。mock 配置cms/envs/mock.yml同样给出了等价示范SOCIAL_AUTH_EDX_OAUTH2_KEY: test_social_auth SOCIAL_AUTH_EDX_OAUTH2_PUBLIC_URL_ROOT: https://courses.localhost SOCIAL_AUTH_EDX_OAUTH2_SECRET: test_oauth2_secret SOCIAL_AUTH_EDX_OAUTH2_URL_ROOT: https://courses.localhost步骤 5分离 Session Cookie让 Studio 发起自己的 OAuth 流程在 Studio 的配置中把 Session Cookie 名称改为独立值使其不再与 LMS 共用SESSION_COOKIE_NAME: studio_sessionid改名的同时是调整SESSION_COOKIE_DOMAIN的好时机。文档明确指出在改名迁移期做域名收窄是干净过渡——因为浏览器判断 Cookie 归属依赖「域名 名称」的组合一旦名称不同旧 Cookie 便不再被发送从而避免因 Cookie 发送顺序不稳定跨子域共享时的经典问题导致的偶发登录异常。具体策略包括收窄SESSION_COOKIE_DOMAIN从宽泛的父域如example.com收窄到各自应用的具体子域如lms.example.com/studio.example.com让其他子域不再能看到彼此的登录 Cookie移除SESSION_COOKIE_DOMAIN置空Cookie 仅对设置它的精确主机生效彻底杜绝子域间读取。Django 默认行为即为主机级 Cookie最终选择取决于你的域名布局文档提示这已超出本文范围需按部署拓扑自行权衡子域共享便利性 vs. 安全暴露面。在 devstack 中该配置已在 cms/envs/devstack.py 落地为SESSION_COOKIE_NAME studio_sessionidmock 配置cms/envs/mock.yml同样使用SESSION_COOKIE_NAME: studio_sessionid可作为生产配置的参照基准。四、devstack 与 sandbox自动配置的例外情况文档明确devstack 与 sandbox会自动配置 OAuth无需手动执行上述迁移步骤。仓库源码印证了这一点——devstack 中 Studio 侧的 OAuth 参数、独立 Cookie 名、LMS 侧的登出联动列表都已预置完毕见上文引用的 cms/envs/devstack.py 与 lms/envs/devstack.py本地开发开箱即用。因此上述五步只面向stage / production 等真实部署环境。五、迁移影响与验证清单完成迁移后应从以下角度验证并处理遗留影响用户重新登录Session Cookie 分离后Studio 用户原有登录态失效首次访问会通过 LMS OAuth 流程重新认证这是预期行为建议纳入变更通知。回调完整性核对--redirect-uris中的https://studio.YOURSITE/complete/edx-oauth2/与你配置的 Studio 公网根地址是否一致且该地址必须能被浏览器与 LMS 双向访问。登出联动在 LMS 登出后确认 Studio 也同时登出验证IDA_LOGOUT_URI_LIST生效。凭据安全生产环境的SOCIAL_AUTH_EDX_OAUTH2_SECRET必须使用高熵随机值切忌沿用 devstack 的演示值。六、结语从 Lilac 到 Maple 的 Studio 登录迁移本质上是把「跨子域共享 Cookie 的隐式信任」替换为「基于 OAuth2 授权码的显式 SSO」。上述五步环环相扣服务账号与 OAuth 客户端负责认证链路IDA_LOGOUT_URI_LIST负责登出链路SESSION_COOKIE_NAME与SESSION_COOKIE_DOMAIN负责会话隔离。任何一步缺失都会导致 Studio 登录不可用。本文所有配置均有仓库源码背书读者可直接对照 docs/studio_oauth.rst 原文、create_dot_application.py 命令实现及其测试用例 test_create_dot_application.py 进一步深入。【免费下载链接】openedx-platformThe Open edX LMS Studio, powering education sites around the world!项目地址: https://gitcode.com/GitHub_Trending/ed/openedx-platform创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表