【前后端分离】基于SpringCloud的分布式OAuth2.0认证中心最佳实践

写在前面

Hello,大家好,我是迷失了方向de飞鱼,是一条有梦想的,会飞的咸鱼。只不过这只咸鱼有点特殊,会写代码,哈哈。

作为新博客的第一篇文章,也希望能够有机会向真正有学问的大佬们请教点东西,小弟先声明我不是大佬,更不是大牛,我是一条有梦想的咸鱼。。。好了,废话不多说,咱们进入正题。

关于OAuth2.0

对于大多数写Java的小伙伴,OAuth2.0协议我相信大家都不会陌生,这个协议看起来很新,其实也是个老古董了。我们熟知的QQ一键登录,微信登录,微博登录,谷歌登录等等,其实都是基于OAuth2.0协议的,而且使用的是授权码模式(Authorization Code)。好了,这不是本篇博客的重点,丢给你们一条链接:我是官网

还有一个具体到实现的OAuth官网,里面有着非常详细的描述 https://www.oauth.com/

关于Spring Cloud

Spring这个技术栈相信已经是Java程序员人手一份的囊中物了,现在微服务架构非常稳定,也相当热门,同时分布式架构是未来的大趋势,选择大厂Spring的分布式框架,还是基于REST的,在保证未来扩展性和降低数据交互复杂度的考虑上毋庸置疑。

技术选型和痛点

笔者最近有一个项目,这个项目要求实现单点登录。很多小伙伴们一听坐不住了,不就是单点登录么,简单的很,直接上CAS Server啊。
我想大概你们听了我们的需求就知道为什么没这么简单了。

为了快速给大家介绍这个项目又避免泄露一些机密😊,笔者就含糊的说一下:

  • 项目最初的目的是整合各个子系统,实现统一维护和数据共享。事实上这些子系统 非常老旧,且技术选型 完全不一样
  • 每个项目都有独立的用户体系,且用户的各个属性几乎都不一样,很难抽离出元数据
  • 客户端形态不一,有移动客户端,有Web端,不排除还有PC端。😭
  • 最大的问题,也是最难解决的问题,是要在保持各个系统用户体系的前提下,又能够让用户通过授权的方式使得子系统获得中心的用户数据,数据中心负责整合和分发这些数据
黑人问号

刚接到这个需求是一脸懵逼啊!
根据上述的需求,大家能够发现一部分需求是能通过传统的单点登录解决的,比如数据共享,用户状态保持,但是根本性的问题没有得到很好的解决,所有操作耦合在服务端中,票据的分发和授权都在服务端由逻辑完成,用户无法精确的知道自己的信息究竟发生了哪些变化,同时被哪个系统取得。用户不知情的情况下,是无法继续使用的。

综上,笔者浏览了很多相关的场景,结合目前的需求情况,同时能够满足低耦合的架构,就是OAuth2.0协议。
OAuth2.0协议在CAS的最新版本中已经支持,而且我想说的是这个协议本身,CAS Server也很好用,不过笔者这次选择了Spring Security OAuth的实现。哈哈,用了Spring Cloud了都,就顺手组个Spring全家桶吧,各项兼容都最好。

考虑到有移动端App,官方又强烈建议App的外部认证使用OAuth2.0协议,这更加坚定了我的选择。
还有一个重要的因素,是CAS实现的单点,数据都在客户端服务器那里,在本场景中,公共数据是维护在数据中心的,这些数据还要由另外一个服务器来保障访问安全性。

关于OAuth2.0服务端的实现的选择有非常多,大家可以参考:
https://oauth.net/code/

😎开工!

话说到这里,开始干活。
可能有些朋友会说我“第一次发博就这么BB,尽讲一堆没用的”。我想说:
草啊

能看到这里真的很感谢大家的耐心!如果你多看看我的博客就好了!因为文章还在施工,所以。。。这篇简单来说就是说了一堆废话!太不好意思了,客观快来,详细的步骤请参考这篇博客:
点击访问

Written with StackEdit.

MIT
本文链接:http://blog.flyfish.group/2020/01/07/oauth2-practice/