一、前言
在之前的文章中,我介绍了开源项目JustAuth的Spring Boot Starter和第三方登录常见的标准化流程,同时了解了其中的几个关键的类,本文开始分享介绍JustAuth的源码的设计与实现,希望通过学会源码的设计,可以在日常工作中,可以完成自己项目的第三方系统的登录过程,可以知道JustAuth的核心设计中是如何完成小而全而美的第三方登录开源组件。如何支持Github、Gitee、微博、钉钉、百度、Coding、腾讯云开发者平台、OSChina、支付宝、QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软、今日头条、Teambition、StackOverflow、Pinterest、人人、华为、企业微信、酷家乐、Gitlab、美团、饿了么、推特、飞书、京东、阿里云、喜马拉雅、Amazon、Slack和Line等第三方平台的授权登录的功能的。
上篇文章中我也分享了到底如何看源码的几个方法,我觉得看源码需要找到切入点。
阅读源码的从切入点入手的几个方法如下:
1、带着问题或目标去作为阅读源码的切入点
想象你去超市购物,但没有清单就像盲人摸象。带着问题或目标去阅读源码就像提前写好购物清单,你知道自己要找什么,能更快找到解决方案。比如:“这个方法为什么会出错?”或者“如何实现这个功能?”这样,你的阅读就有了方向,不至于在代码的海洋里迷失方向。
2、通过项目的ISSUE或项目的PR来作为阅读源码的切入点
这就像是去看电影前的影评,你会知道剧情的走向和主要冲突。项目的 ISSUE 和 PR 记录了开发者的“故事”,让你了解遇到的问题和解决方案。阅读这些内容,仿佛是在翻阅开发者的日记,可以帮助你快速把握项目的进展和思路。
3、从项目的Starter工程作为阅读源码的切入点
想象你在一个餐厅的菜单上挑选最吸引你的开胃菜。Starter 工程就是这些美味的开胃菜,它们提供了项目的基本功能。通过了解这些 Starter,你可以轻松找到关键的实现方式,就像发现了最受欢迎的菜品,帮助你快速上手。
4、通过项目的单元测试类作为阅读源码的切入点
单元测试类就像是项目的“体检报告”,它告诉你哪些地方健康、哪些地方需要修补。阅读测试类,你可以看到功能是如何被验证的,仿佛在看医生给你讲解身体健康一样。了解测试用例能让你明白代码的预期行为,帮助你更好地理解源码。
二、正文
首先回顾下,上文中讲到过的这个类,我们先从这个类的实现上入手,从这个类中可以看到,我们核心关注的就是AuthRequest的实现和login方法的实现,第三方登录的对接其实并不难,本质就是提供2个接口,一个获取第三方跳转授权的URL,一个解析回调参数中的code值用于解析真实的用户名然后登录
如果未来有人问你如何设计和开发优雅的第三方登录功能,可以把JustAuth的设计思想说给他们。其次就是记住第三方登录大部分就是提供这两个接口。
2.1、源码工程搭建
可以看到JustAuth的源码工程上,目录倒是不多,也是非常容易阅读的,从这里我们可以看到一个非常普遍的SDK的设计分包结构,这也是值得我们学习的,如果未来我们自己设计一个SDK项目,也可以先把这些包结构创建好:
我们先来快速看一下,目前它都支持了哪些第三方登录请求的实现,从他的request包中可以看到:
2.2、以Gitee为例的Request体系设计
这里我们以Gitee这个第三方登录请求的设计与实现为例,可以看到它定义了2个相关的类,一个Scope,一个是Request
然后阅读下AuthGiteeRequest的源码,可以看到类的设计非常简单,也是我们之前说过的第三方登录最本质的内容:
通过阅读这个源码我们可以知道,第三方登录最本质的开发就是提供一个拼接授权字符串的方法,提供一个解析accesstoken的方式,提供一个获取用户信息的方法,而在justauth的源码设计中,已经帮助我们设计了一套统一的第三方登录的授权模型,我们只需要实现这几个方法即可,获取token方法本质就是发送个HTTP请求拿Code换取token,获取用户信息方法,本质就是发送个HTTP请求拿token获取用户信息的方法,JustAuth中帮我们设计了2个模型类:AuthToken、AuthUser。
然后我们从源码中看到它继承了一个AuthDefaultRequest的请求,该类是一个抽象类,有抽象类的地方有可能会有模板方法设计模式:
从截图中,可以看到这个是一个非常明显的基于模板设计模式的设计与实现,自身是个抽象类,子类只需要继承这个模板类即可。再看下核心的几个类关系图:
通过阅读这个类,可以知道,它为自己类提供了2个抽象的方法,剩下的公共方法都是辅助我们开发的方法:
这样我们就知道了JustAuth中的Request模式的设计,通过模板+策略的设计,实现了多种可扩展和统一的第三方登录的对接与实现
2.3、回调login方法的解析过程
看图,可以非常容易知道,本质他就是做了一个非常业务化动作的编排:
它解析了回调中的Code参数是否存在,然后发送请求获取Token,然后拿Token获取用户信息,返回处理成功,业务代码中就可以通过自己的规则进行登录逻辑了。
看到这里是不是觉得第三方登录的设计很简单了,没错就是这样的。然后我们对接抖音登录、头条登录也是如此的设计。到这里request包中的内容我们就阅读完了。
上面就是一个非常简单的主线流程,阅读源码的时候,先看主线也是一个学习源码的过程中比较重要的方法,第一遍阅读,不需要关注分支流程,要先把主流程搞清楚。
2.4、JustAuth中的4个模型
在JustAuth中,主要的业务模型就4个,即model包中的4个:
对于AuthCallback类,重要的就是code和state属性了,未来即使项目中不用justauth框架,我们在设计第三方登录的回调接口中,也可以至少写上这两个属性:
对于AuthToken类来说,里面的属性就是综合了各个登录平台的Token相关的属性。
对于AuthUser类来说,里面的属性也是综合了各个登录平台的用户相关的属性信息。
2.5、JustAuth中AuthDefaultSource
这个类也是值得我们学习的,在这个类中统一通过枚举类维护了不同平台的访问地址信息,是不是很巧妙呢,他没有用枚举类属性的方式维护,而是用户枚举类实现了一个接口,我相信这种用户大家平时用的少,不过感觉这种场景下用户方法来处理感觉确实挺合适的:
三、最后
希望通过本文这个非常简单的流程化的第三方登录的解析,让每个人都清楚如何开发一个第三方登录的源码服务设计,不要看他小,一旦你掌握了它,设计出优雅的第三方登录的设计也是非常不错的。同时留个思考题,如果让你在他的源码上新增一种第三方登录接口的设计,你现在会添加了吗,比如让你基于JustAuth的源码,新维护一个第三方登录请求的实现,是否可以呢,可以试试哦。