关于 SSO 单点登录中,单点退出以及某一系统切换了登录用户,其他子系统也一并切换为这个用户。
有一个问题是,我现在实现了单点登录,那么单点退出如何实现让全部子系统都退出,A 系统退出登录并重定向至 SSO 登录页面,那么这时候 B 系统本地还存在 Cookie,这个其实也简单,服务端的凭证存到 Redis 中,退出登录是需要删除 Redis 中凭证的,当 B 系统进行操作时中间件判断 Redis 中不存在该用户登录凭证了则返回登录失效错误码重定向至登录页。
那么还有一个场景是A系统登录了,B系统也登录了,这时候 A 系统退出登录重定向至 SSO 登录,并切换了一个用户登录,然后 B 系统本地还是 老的 cookie,然后验证的时候服务器返回了登录失效错误码重定向了登录页。
这种情况如何让 B 系统自动的将本地 cookie 换成刚刚 A 系统切换掉的那个用户。
针对第一个场景,我觉得AB共享redis的方案不是很合理,这意味着架构上产生了耦合,我目前的方案是在sso登录的时候ticket在验证完成之后作为会话凭据,注销登录时在sso中心注销该凭据,A\B系统每次鉴权时通过接口去验证这个凭据是否有效。
针对第二个场景,我的做法是在上面方案的基础上,鉴权失败后B项目的页面会被重定向到SSO的一个中间跳转页,比如:
http://sso.xxx.com/app_key=xxxx&redirect_url=xxxxx
,然后sso确认app_key和redirect_url合法后,会跳转至redirect_url并且在url中携带一个上面所说的ticket,这个ticket会被B的后端用来向sso的后端验证凭据,验证成功后B项目设置自己的登录态就可以了。