单点登录SSO流程分析
用户访问网站A,需要认证登录。网站A重定向至登录站
SSO(这里会走一次第五步)。如果
SSO判断用户没有登录则需要用户提交口令登录。登录成功之后在SSO站点域名下面写上关于SSO的SESSION_IDCookie并且重定向(带上一段token)至网站A。网站A拿到token之后去后端检查token有效性,有效则用户登录。
接下来用户访问网站B,需要认证登录,重定向到登录站SSO。
SSO检查当前域名下是否有已经登录过的Cookie如果有直接生成token重定向至原来的网站(否则走第二步)接下来走第三步。
所有站点的
Auth中间件都会去SSO判断用户是否登录
如果用户退出登录,触发退出登录站点会去
SSO中心注销当前用户登录信息。
这种流程方式是否有问题?还有其他方式吗?欢迎探讨、交流
关于 LearnKu
我就想知道你实现了嘛
用三个项目来实现以下 你就晓得了
没问题 流程就是ABC三个项目,一个 SSO 项目. a.com b.com c.com sso.com
a.com/a被访问,在中间件/拦截器/过滤器里判断未登录 ,重定向到 SSO(sso.com/login?backurl=a.com/a),SSO判断当前用户未登录,让用户登录.session,生成一个token,写入到session,同时写入到redis,key是token,value是userid, 然后SSO 给客户端一个302响应,同时重定向到a.com/a?token=xxxxAuth中间件里判断session未登录,但是 querystring 里有token参数,根据token查 redis 拿到userid,Auth:: loginUsingId(userid),下次访问 a 就是登录了b.com/b,访问 b 浏览器只会携带domain是 b.com 的cookie,在 a 和 sso 登录就没用了,b 的中间件判断没登录, 去sso.com/login?backurl=b.com/bdomain是sso.com的cookie,sso 查到session已登录还能拿到token,直接302b.com/b?token=xxx要点是 abc,sso 访问一个 redis 服务,浏览器访问网站自动携带当前域名的 cookie