Java|Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)

一、什么是单点登录? 单点登录的英文名叫做:Single Sign On(简称SSO)。
以前的时候,一般我们就单系统,所有的功能都在同一个系统上。
Java|Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)
文章图片

后来,我们为了合理利用资源和降低耦合性,于是把单系统拆分成多个子系统。
Java|Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)
文章图片

比如阿里的淘宝和天猫,很明显地我们可以知道这是两个系统,但是你在使用的时候,登录了天猫,淘宝也会自动登录。,反过来也一样
Java|Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)
文章图片

简单来说,单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。
二、回顾单系统登录 简单讲述一下怎么做单系统登录的:
众所周知,HTTP是无状态的协议,这意味着服务器无法确认用户的信息。于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie。
如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当于在服务器中建立了一份“客户明细表”。
HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session是依据Cookie来识别是否是同一个用户。
所以,一般我们单系统实现登录会这样做:
登录: 将用户信息保存在Session对象中,如果在Session对象中能查到,说明已经登录如果在Session对象中查不到,说明没登录(或者已经退出了登录)
关闭浏览器: 从Session中删除用户的信息(关闭掉浏览器后,重新打开浏览器还能保持登录状态):配合Cookie来用
退出登录: 清除session,和本地cookie,跳转到登录页
具体流程:
可以看我博客的 JavaWeb-免登录UML时序图-(全网最详细) 这里面有最详细的教程
三、2种单系统登录UML时序图 因为细节太多了,所以这里只画出来流程的大概走向而具体的细节后面会说.
第一种单点登录(和淘宝,天猫一样) 都使用自己系统的登录注册页面,但是认证服务都是用一个
Java|Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)
文章图片

第二种单点登录,都使用SSO认证服务的登录页面,而注册页面因为每个系统账户注册的信息可能都不同那么可以利用重定向使用自己的注册页面(这个就需要自己设计了)
Java|Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)
文章图片

需要的技术 我们这里只实现第一种时序图的单点登录,第二种的话自己看图写代码就行了比较简单
前端工具: WebStorm 或者vs code …
后端工具: IntelliJ IDEA
前端需要的技术: vue , jquery , js , ajax , 加密算法…
【Java|Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)】后端需要的技术 java, Springboot , cookie , session , redis 加密算法…
实战案例(可跨二级域名) 项目前后端代码和效果视频:
链接:https://pan.baidu.com/s/1yxQ0bIcwKXYsdjc3qYtQzQ
提取码:1234
跨一级域名的案例 想要跨一级域名的最佳方式是前端使用iframe+postMessage的方式,后端认证中心将cookie存储jwtToken改为redis,因为cookie不能跨1级域名,而我们代码是通过上面实战案例(可跨二级域名)改造的,如果你上面的代码都看不懂那么就别看这个案例了,必须前后端都要看懂,下图是一级域名的跨域逻辑
Java|Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)
文章图片

项目前后端代码和效果视频(升级版):
链接:https://pan.baidu.com/s/1xc2mHbN0PzhVsUk_PpMkHQ
提取码:1234
单点登录的注册,和登出,以及登录超时…原理,在我提供的项目里都有视频中也有展示,基本单点一套全完成了,需要自行看看代码,很简单其实,就看你能不能有耐心看完代码了,别忘了给我来个赞,写文章和项目不容易
access_token和refresh_token 按照Oauth2.0 的规则是需要有refresh_token和 access_token的,这个可以根据需求进行添加

  1. 登录成功返回 前端access_token和refresh_token
  2. 每次请求只携带access_token
  3. 如果access_token过期那么前端拿refresh_token换新的access_token
  4. refresh_token过期,重新进行登录
建议尽量将refresh_token保留在服务器上,而不是前端
列如:
  1. 我们可以放入redis中,key是ClientID(客服注册服务的唯一ID),value就是refresh_token
  2. 注册的ClientID写死在前端代码中
  3. 请刷新接口时候携带access_token和ClientID
  4. 利用ClientID去redis中找refresh_token换新的access_token
  5. refresh_token过期,重新进行登录
这样的好处就是ClientID注册时候会绑定指定的域名或者ip的如果是非法用户那么是无法请求成功的, 就算拿到access_token了也持续不了多久一般access_token设置时间非常短的可能就10~30秒就过期了
(我上面代码是没有做这个套机制的)
点赞 -收藏-关注-便于以后复习和收到最新内容 有其他问题在评论区讨论-或者私信我-收到会在第一时间回复 如有侵权,请私信联系我 感谢,配合,希望我的努力对你有帮助^_^ Java|Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)
文章图片

    推荐阅读