一、背景
作为一名开发人员,可能在我们刚开始学习编程开发的时候,最开始接触到的功能可能就是登录了,我相信每个人在开始自己开发功能的时候,都是从登录功能开始的,老师们告诉我们定义2个HTML元素,输入用户名和密码,然后实现登录,让我们学会到了基本的程序思维。而后面随着开发经验的增长,我似乎发现几乎每个开发者每年开发都会涉及到登录及其相关联的功能开发。由此可见,登录功能是所有系统的必不可少的东西,这里还产生了一个有意思的东西,就是一直有很多人,写登录的时候,会出现字面上的模糊:
你有没有写错过字呢。
本文开始分享登录功能中的第三方登录的设计与实现,第三方登录在企业级项目的开发中很重要,如果自己开发系统上线后,不想新维护一套用户数据体系,此时首选方案就是用存在的其他系统用户来登录这个新系统,此时这个过程可以看成是第三方登录,同时关联的还有一个登录技术:SSO单点登录。
1. 第三方登录的概念、定位
概念:第三方登录,顾名思义,就是通过第三方的服务来完成你在某个应用或网站上的登录过程。比如说,你在某个购物网站上点击“使用微信登录”,然后就直接通过你的微信账号登录了这个购物网站,而不需要再单独为这个购物网站注册一个账号。
定位:主要是为了方便用户,减少用户需要记住的账号和密码的数量,同时也帮助应用或网站吸引更多的用户,因为用户可能觉得用已有的账号登录更加方便。
2. SSO单点登录的概念、定位
概念:SSO是Single Sign-On的缩写,意思是单点登录。它的主要特点是,用户在一处登录后,就可以在其他多个相关的应用或系统中无需再次登录。比如说,你在公司的门户网站上登录了,然后你再去访问公司的邮件系统、办公系统等,都不需要再次输入用户名和密码。
定位:主要是为了提高用户体验和工作效率,同时也加强了安全性,因为用户不需要在每个应用或系统中都输入用户名和密码,减少了密码泄露的风险。
二者的区别
- 范围不同:第三方登录通常是跨不同公司或服务的,比如用微信登录京东;而SSO通常是在同一个公司或组织内部的多个应用或系统之间实现的。
- 目的略有不同:第三方登录主要是为了方便用户注册和登录,吸引更多用户;而SSO主要是为了提高用户体验和工作效率,加强安全性。
- 实现方式可能不同:第三方登录通常是通过OAuth等开放授权标准来实现的;而SSO的实现方式可能更加多样,包括但不限于Kerberos、SAML、OpenID Connect等协议和技术。
本阶段开始分享的开源第三方登录组件JustAuth,它是一个非常快速开箱即用的整合第三方登录的开源组件。学会它的设计思想后,完全可以在日常企业的开发中,具备了设计一种优雅和可扩展的第三方登录的代码设计,不管是对接什么第三方登录,本质核心的思想都是一致的。
二、储备知识
在开发第三方登录功能的过程中,我们需要始终明白在这个过程中产生的业务需求、技术概念、实现流程大概都是什么样的,这样当我们学习和开发第三方登录的时候,可以更容易的识别到哪些关键点使我们需要去研究和关注的。
当我们谈论第三方登录及其开发过程时,一般可以三个维度来理解它:业务需求、技术概念和实现流程。
2.1、业务需求
在Web应用或移动应用开发中,为了提供更好的用户体验和吸引更多用户,开发者常常需要集成第三方登录功能。这意味着,用户可以使用他们已有的、在第三方平台上注册的账号(如微信、QQ、微博、Google、Facebook等)来直接登录应用,而无需在应用内重新注册账号。这样做不仅简化了用户的注册和登录流程,还降低了用户因忘记应用密码而无法登录的风险。
2.2、技术概念
实现第三方登录的关键技术概念包括:
在第三方登录中,涉及到多个关键概念,这些概念对于理解其工作原理和实现流程至关重要。以下是其中的至少10个相关概念:
**OAuth(开放授权):**一种开放标准,用于授权第三方应用访问用户在其他服务上的资源,而无需将用户名和密码暴露给第三方。
**OpenID Connect:**基于OAuth 2.0的认证层协议,提供单点登录(SSO)和获取用户身份信息的功能。
**第三方平台:**提供登录服务的外部平台,如微信、QQ、微博、Google、Facebook等,用户在这些平台上已有账号。
**应用ID与密钥:**开发者在第三方平台注册应用后获得的唯一标识符和安全密钥,用于应用与第三方平台之间的认证。
**授权码(Authorization Code):**用户授权后,第三方平台生成的一个临时代码,应用需用此代码交换访问令牌。
**访问令牌(Access Token):**用于访问第三方平台上用户数据的密钥,应用需妥善保管并定期刷新。
刷新令牌(Refresh Token): 用于在访问令牌过期时获取新的访问令牌,而不需要重新引导用户进行授权。
**回调URL(Redirect URI):**用户完成在第三方平台上的授权后,第三方平台将用户重定向回应用指定的URL,通常携带授权码或错误信息。
**作用域(Scope):**定义了应用请求访问用户数据的范围和权限,例如只读访问基本信息、读写访问邮箱等。
**用户信息(User Info):**用户授权后,应用通过访问令牌从第三方平台获取的用户基本信息,如昵称、头像、邮箱等。
这些概念在第三方登录的整个流程中起到关键作用,从用户发起登录请求,到应用获取用户信息并完成登录注册流程,每一步都离不开这些概念的支持。了解这些概念有助于我们更好地实现和维护第三方登录功能。
2.3、实现流程
- 注册应用:首先,开发者需要在第三方平台的开发者中心注册自己的应用,并获取应用ID和密钥。
- 引导用户登录:在应用的前端界面中,开发者会提供一个或多个第三方登录按钮。当用户点击某个按钮时,应用会引导用户跳转到对应的第三方平台的登录页面。
- 用户授权:用户在第三方平台的登录页面完成登录后,会被要求授权给应用访问其基本信息。如果用户同意授权,第三方平台会生成一个授权码或访问令牌,并将其重定向回应用指定的回调URL。
- 获取访问令牌:应用收到回调后,会使用之前获取的应用ID和密钥,以及用户授权的授权码或访问令牌,向第三方平台发起请求,以获取访问用户数据的访问令牌。
- 访问用户数据:有了访问令牌后,应用就可以使用该令牌访问用户在第三方平台上的基本信息(如昵称、头像等),并将这些信息同步到自己的应用中,完成用户的登录和注册流程。
2.4、白话描述
在JustAuth的官方文档中,有这样一个大白话来描述了第三方登录的过程,这里我根据其描述,用知识星球的微信登录作为例子,来描述下知识星球的微信登录的这个第三方登录的基本过程。首先我定义了3个参与的角色信息:
访问系统的用户、提供目标服务的知识星球、提供第三方登录的微信
即用户打开知识星球后,如何用第三方的微信登录,来登录当前的目标服务知识星球。
大家如果理解这个过程,其实也就理解了第三方登录基本交互过程。
如果看过之前的分享,大家应该知道这个图是如何画出来的,如果没有看过之前的分享,会不会认为这个图是通过工具画出来了,这个图是使用Mermaid语法的文字写出来的,它可以根据我们的时序图的语法生成图片,具体代码如下:
---
title: 第三方登录时序图
config:
theme: forest
---
sequenceDiagram
autonumber
actor 用户
participant 知识星球
participant 微信
用户 ->> 知识星球: 我准备登录知识星球了
知识星球 -->> 用户: 我不认识你
用户 ->> 微信: 稍等,我找下我的大哥(微信),帮我介绍下,把我的授权码code给知识星球吧
微信 ->> 知识星球: 刚才有人想让我给你介绍一下,先给你个授权码code
知识星球 -->> 微信: 我收到了,这个授权码我担心是不是真的, 是真的,就把他的accessToken给我吧
微信 ->> 知识星球: 嗯,我给你下他的访问令牌,你要知道他是谁,你就拿着这个找我就行
知识星球 -->> 微信: 好的,那我就先给你下令牌,我要他用户的基本信息
微信 ->> 知识星球: OK,令牌是对的,我把他的基本信息给你了,你自己玩吧
知识星球 ->> 知识星球: 我看到了,我准备把他信息存起来,在给他个我的联系方式
知识星球 ->> 用户: 看了你的基本信息,我知道了,我允许你登录了,来吧
用户 -->> 知识星球: 十分感谢,我登录成功了,太感谢我的大哥微信了。
把这个代码放到任意一款支持Mermaid语法的编辑器即可,这里我用的是官方的在线编辑器,地址如下:
如果你日后做相关的第三方登录,请牢记上面的那个流程,根据我多年的经验来看,基本上确实是这个道理,我用一个第三方登录,登录后第三方系统会回调我们的URL接口,然后我们在接口里面解析出来当前用户的基本信息后,返回给用户登录成功。
三、正文开始
接下来我们开始第三方登录组件JustAuth的初步认识,从现在开始你只需要记住JustAuth本质就是封装了一堆第三方系统的抽象对接过程,本质不难,同时其内部的策略设计模式、模板方法设计模式也是值得我们学习的,这个也是非常让我们值得学习的设计,如果你未来在公司会用到第三方登录,不如从该组件中拿出类似的代码设计,放到公司的项目,那么这个抽象的过程,还是很容易被Leader表扬的。
首先我们要先体验一下第三方登录的过程,这里我们通过阅读官网上面的Demo工程或Starter组件来作为入口:
在该文章中,本质就是通过在项目中引入SpringBoot的依赖,然后提供接口进行处理,这里需要我们记住的一个套路,第三方对接的套路,一定要记住:
1、通常需要一个跳转到第三方网站的地址,该地址可以在前端项目中写死,也可以在后端通过接口与重定向的方式进行维护,justauth案例中使用到了后端定义一个维护的接口进行处理
2、提供一个接收第三方登录后的回调地址,通常该回调地址中可以获取到第三方登录的code参数,然后我们根据第三方的code参数去获取accessToken与用户信息,从而实现第三方用户在当前业务系统的注册与登录。
建议正在阅读文章的小伙伴,根据如下网友文章连接,自己尝试实现Gitee的第三方员工登录开发:
如果你在开发过程中有遇到问题,可以及时和我沟通哦。我看看后续在找个开源项目给大家写个例子,不过我相信当大家理解了第三方登录的原理后,其实自己很容易就是可以实现Gitee这种第三方登录功能的对接的独立完成。
四、第三方登录的企业级使用
在实际企业级的公司开发过程中,企业中对于第三方或SSO那边登录成功后的用户处理逻辑会有不同的实现,用SSO作为系统的登录是非常多的,如果SSO使用oauth实现,其实本质也是一种第三方登录了。
对于登录过程中的用户处理,目前我个人遇到的处理后续动作的2个玩法大概如下:
(1)、允许用户自动注册
(2)、需要提前注册到系统中,然后第三方登录解析出当前的用户后,如果不存在就不让他登录了
五、总结
本文简单的介绍了第三方登录的基本对接开发过程,希望每个人都会设计出一种非常优雅的第三方登录的对接,这个计划在下篇文章中,从JustAuth源码设计的角度分享一下,再次之前可以提前了解下。
感兴趣的可以一起评论、交流、分享、收藏、点赞哦