写在前面
本文上将单点登录的实现,以及本人的理解写出来,仅供参考
单点登录概念
- 这里要区别于分布式会话,分布式会话是在一个系统中,一个大的域名下的众多子域名中共享会话
- 而单点登录,是在一个集团下,多个不同域名的系统进行共享登录状态(这里不是会话哦),实现一个登录,个个登录
- 用这样的图来表示,不同的系统域名是不一样的,且不具有父子域的关系,同时,它们的上级域名是
.com
,所以根本没有办法参考分布式session,把cookie的domain设置成父域来解决 - 所以这里采取的方式是,抽取出一个系统,单独的作为认证中心,所有的系统都信任该认证中心
单点登录实现流程
- 这里,我将系统都称为客户client,客户!=用户
成员:server clientA clientB 浏览器
- 浏览器访问clientA,clientA检查:
有无session登录信息,有则直接通过
请求路径中有无token信息,有则向server查询该token,获得用户信息,如果成功,则通过,并且将用户信息放到自己的session中
- 以上都失败,clientA以自己的地址作为回调地址(之后算是重新请求),放入url,让浏览器重定向到server,进行统一登录
- server检查:
如果有token,则将token在redis中查询对应用户信息,如果查询到,则将token返回给客户的回调地址,等待客户进行查询
- 如果以上失败,说明该用户从未登录过,则进行登录操作,返回给浏览器登录页面
- 浏览器输入登录信息,交给server
- server进行验证,登录成功后,做三件事
首先将为用户生成的token放到自己的session中
然后以token为key,用户信息为value,存入redis中
将token返回给回调地址
在clienA登录过的情况下,浏览器第一次访问clientB
- 浏览器访问clientB,clientB发现没有session中的用户信息,也不携带token
- clientB让浏览器重定向到server,加入clientB的回调地址
- server发现该请求中cookie里有token,则将token查询到用户信息,返回token给回调地址
- clientB收到token,进行查询,然后获得用户信息
- 将用户信息放入自己的session,然后通过登录
关于单点登录的理解
- redis是只有server用的,而token是为了获取用户信息的。客户不能访问redis,这也一定程度上保证了安全性
- 任何系统的登录都需要经过server,这种全权委托第三方server来进行认证,才能实现单点登录,对于每个系统而言,server是它们信任的机构
- 登录完成之后,server给客户返回token。而客户为了确认用户信息,需要拿这个token再次向server进行查询。
- 只要当前系统中没有用户信息,就交给server来进行处理。
- server为了识别用户,所以在自己的域名下加入了cookie,cookie信息就是token,这样才能识别用户状态。同时,基于哪里不会就交给server来处理,server总能接收到用户的登录请求。
- 客户重定向给server之前,都会在url中添加自己的回调地址,从而使得server处理完正确登录之后能够跳转回来,同时跳转回来时,会带上token
参考资料
尚硅谷视频