Django SSO
1. 模块定位
Section titled “1. 模块定位”本架构基于 django-sso 开源模块,旨在实现多个分离的 App 系统之间共享统一的用户认证状态。
2. 核心认证时序流程
Section titled “2. 核心认证时序流程”架构中涉及四大核心节点:
app_server:用户首次访问的业务应用。app_other:用户后续访问的其他关联业务应用。browser:客户端浏览器。sso_server:中央认证与授权控制节点。
2.1. 初次登录请求流程
Section titled “2.1. 初次登录请求流程”browser-(/login)>app_server:用户针对特定的 app 发起访问请求。app_server-(/sso/obtain)>sso_server:App Server 向中央 SSO 获取颁发的授权凭证。app_server-(redirect)>browser:App 响应登录请求。返回一个重定向响应,指示重定向到sso_server的/login(GET);同时此响应会携带一个 Cookie,用于在浏览器侧记录该授权凭证的 Session。browser-(/login GET)>sso_server:浏览器获取到 SSO 的中央登录页面。browser-(/login POST)>sso_server:用户通过 SSO 登录表单输入账密实现认证。sso_server-(/sso/event/)>app_server->browser:SSO 先将登录成功后的用户信息后台传递给app_server。随后向浏览器下发重定向响应(重定向到app_server的/sso/accept),并携带用于记录用户信息的 Session Cookie。browser-(/sso/accept/)>app_server:浏览器重定向回具体的业务 App。app_server-(/sso/get/ & /sso/makeused/)>sso_server:App Server 获取用户初始的回调链接,并向 SSO 声明将该授权 Token 标记为“已使用”。app_server-(redirect)>browser:用户彻底登录成功,看到最终业务页面。
2.2. 再次登录同一 app_server
Section titled “2.2. 再次登录同一 app_server”browser-(/login)>app_server:用户再次请求登录。app_server检测到本地 Session 信息存在且有效,直接重定向到用户的回调链接,无需向 SSO 发起校验。
2.3. 登录生态内的其他应用 (app_other)
Section titled “2.3. 登录生态内的其他应用 (app_other)”这是 SSO 的核心价值(一处登录,处处通行):
browser-(/login)>app_other:用户访问新的业务应用。app_other-(/sso/obtain)>sso_server:获取新的授权凭证。app_other-(redirect)>browser:重定向浏览器到sso_server的/login(GET),并下发凭证 Cookie。browser-(/login GET)>sso_server:向 SSO 发起登录。此时 SSO 检测到该浏览器已存在中央认证 Session,直接响应重定向到app_other的/sso/accept。browser-(/sso/accept/)>app_other:携带令牌回跳。app_other-(/sso/get/ & /sso/makeused/)>sso_server:获取回调连接,核销 Token。app_other-(redirect)>browser:用户无感登录成功。
3. 权限控制与登出注销
Section titled “3. 权限控制与登出注销”3.1. 管理员取消单一 App 授权
Section titled “3.1. 管理员取消单一 App 授权”browser发起删除请求 ->sso_server。sso_server-(/sso/event/)>app_server:通知业务端删除本地对应的 Session。sso_server返回删除成功给browser。
3.2. 用户全局统一登出
Section titled “3.2. 用户全局统一登出”browser-(/logout)>app_server:用户在业务端点下线,App Server 删除本地 Session。app_server-(/sso/deauthenticate)>sso_server:通知中心节点取消该凭证,sso_server销毁对应的中央 Session。sso_server响应app_server,完成全局退出。