【Lilishop商城】No4-4.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-web端第三方授权联合登录接口开发

news2024/10/4 22:58:10

仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在: 

【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客


全篇会结合业务介绍重点设计逻辑,其中重点包括接口类、业务类,具体的结合源代码分析,源码读起来也不复杂~

谨慎:源代码中有一些注释是错误的,有的注释意思完全相反,有的注释对不上号,我在阅读过程中就顺手更新了,并且在我不会的地方添加了新的注释,所以在读源代码过程中一定要谨慎啊!

目录

A1.会员联合登录模块

B1.web端第三方授权联合登录接口开发

业务逻辑:

代码逻辑:

        1.专门处理第三方Auth登录请求的小模块 AuthRequest (可先看里面的关系图)

        2.专门处理web端第三方登录的工具类 ConnectUtil

        3.联合登录的业务类 ConnectService

        4.从接口到业务的关系图(可先看)

         5.重点的代码图片(不放源代码了,即多又不方便)

                ConnectBuyerWebController接口: 

                ConnectUtil :

                ConnectServiceImpl :


A1.会员联合登录模块

B1.web端第三方授权联合登录接口开发

web端第三方授权联合登录模块是参照  JustAuth 是一个第三方授权登录的工具类库JustAuth 的,shop项目参照这个工具类库搭建了自己的联合登录工具,并没有完全参照和搭建,是有区别的,但对于目前的是用来说足够了,对我来说也是一种学习呀~~~

所以我们把业务逻辑了解清楚后,再剖析代码逻辑~~~

开始前先说明,web联合登录里面涉及到的第三方登录的逻辑,大多是一致的,是使用的OAuth2.0 的 Authorization code 授权模式【此模式大多是结合普通服务器端应用使用(web端常用的授权方式)】,所以有很多业务可以抽想出来,可在代码逻辑中查看~

联合登录这一块涉及到三个接口。我们以PC端微信扫码授权登录为例:

  1. 首先,用户在PC前端点击微信登录按钮,此时会调用平台的获取第三方信任登录授权路径接口,并且传递入参登录方式(微信PC、微信小程序、QQ等)。此接口中会根据第三方登录方式来拿到对应第三方的授权api ,以及授权api需要的入参(如:appid、scope等),其中必须有redirect_uri 和 state 入参,redirect_uri 是平台的回调地址api(就是 2. 里面的接口),state 是第三方回调时携带的,用于双方有效校验的,所以需要唯一并且存到缓存中。然后根据以上信息拼接成 授权url ,并且返给前端进行重定向。
  2. PC前端接收到后就会重定向到授权url页面,此页面是第三提供的,此时用户使用扫码/登录账号,在第三方成功授权之后,第三方会调用平台的回调接口也就是 1. 中的 redirect_uri api地址,并且会有入参 code 和 state ,code 的是第三方定义的,state 是平台定义的。此接口中通过 code 拿到 accessToken ,再通过 accessToken 拿到用户信息(openid等)。然后根据openid获取绑定的账号,如果能拿到账号,则根据账号创建登录Token。若未关联账号,则根据openid创建新的账号并关联此第三方,然后根据账号创建登录Token。然后以 state 为key 将 Token 缓存起来,用于 3.。最后返回平台PC端登录页面给前端进行重定向,并传参state。【此时的前端是第三方的,第三方会在回调平台页面】 
  3. 第三方回调平台PC端登录页面,在该页面中判断是否有 state 参数,有则调用第三方信任登录响应结果获取接口,并根据 state 拿到 2. 中缓存的 Token 信息,并返回给前端。 

上方流程,还借助于重定向完成的。

总之一句话:

拿到第三方的用户信息(即唯一标识),然后根据用户信息判断有没有绑定帐号,没有则注册然后缓存此账号的登录token,有则直接缓存账号的登录token,然后本平台根据信息再去获取缓存的登录token,然后就登录成功了!

业务逻辑:

业务逻辑就看上面,都描述的很清楚了~

其实没有特别复杂的逻辑,就是有点绕。

那么问题来了,PC端的QQ授权、支付宝授权、微博授权等等都是这样的逻辑,那我们还要对应每种重新开发接口吗?当然不会,相似代码只需要一套,我们不要把代码写死,要通过提高代码的复用性提高代码的可维护性。

那么就需要好好设计代码了,见代码逻辑~~~

代码逻辑:

1.专门处理第三方Auth登录请求的小模块 AuthRequest (可先看里面的关系图)

我们知道各类第三方的流程是相似的,那么特殊的就是第三方的配置信息是不一样的,例如 appid、appSecret、授权url等等,有的是内容不一样,有的连字段也不一样。那么我们就需要将不同的第三方信息存储,并且根据不同的第三方拿取使用。

从以上方面我们就能抽象出一个专门处理第三方Auth登录请求的小模块。为了满足业务。此模块需要包含以下信息的存储、传输:

  1. 第三方授权配置,例如appKey、appSecret、redirectUri等,这里是针对所有第三方的,有的是共用的,有的是某第三方自用的。此处的配置是存到了 setting 里面。
  2. 第三方授权API,授权的api、获取accessToken的api、获取用户信息的api等,这里是针对所有第三方的,有的是共用的,有的是某第三方自用的。

和以下业务的处理:

  1. 根据上面 1. 2. 的信息拼接需要的请求 url ,也就是给api添加参数,例如授权url、获取用户信息url
  2. 设置统一的登录逻辑,先通过code拿到accesstoken,再根据accesstoken拿到用户信息;

 所以我们根据以上结论,并结合着业务逻辑,能够得到下面的模块里类的关系图,思考说明都在图中了~~~

2.专门处理web端第三方登录的工具类 ConnectUtil

和上面的专门处理第三方Auth登录请求的小模块有啥区别呢?

ConnectUtil工具类是承接联合登录请求接口和联合登录业务类的工具类,主要是通过Auth登录请求模块拿到配置信息,然后根据业务调用联合登录业务类 ConnectService 处理具体的平台业务。

明白了,也就是一个中间工具~~~

主要方法有:

  1. AuthRequest getAuthRequest(String type) 通过登录方式返回对应的第三方授权请求对象
  2. void callback(String type, AuthCallback callback, ...) 登录回调方法
  3. ResultMessage<Object> getResult(String state) 获取联合登录响应结果

1 只需要AuthRequest 配合,3 只需要 Cache 配合,那 2 就会涉及到下面的联合登录业务类 ConnectService 了。

3.联合登录的业务类 ConnectService

这个类在上篇处理微信小程序的授权登录时,就出现过,那么在这里的逻辑就很简单了,他才是专门处理联合登录的最终业务类!!!

由于涉及会员的操作,所以该类里面需要注入会员业务类 MemberService

可以看到,本类主要的思想:根据第三方的用户信息来操作联合登录业务。

4.从接口到业务的关系图(可先看)

 5.重点的代码图片(不放源代码了,即多又不方便)

ConnectBuyerWebController接口: 

ConnectUtil :

 

上面这里要注意一下,重定向是重定向到平台的某页面,最好是登录页面, 并且传递 state 参数,这个参数对应保存的 token 的 key 哦~~~使用唯一值就可以,这里直接拿的第三方的临时登录授权code,但是名字是调用授权url 的 state ,反正要注意哦~~~

ConnectServiceImpl :

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习——支持向量机(SVM)

文章目录1. 优化目标2. 大间距的直观理解3. 大间距分类背后的数学支持向量机&#xff08;Support Vector Machines&#xff09;是广泛应用于工业界和学术界的一种监督学习算法&#xff0c;在学习复杂的非线性方程时提供了一种更为清晰&#xff0c;更加强大的方式。下面从SVM的优…

【nowcoder】笔试强训Day10

目录 一、选择题 二、编程题 2.1井字棋 2.2密码强度等级 一、选择题 1.下列运算符合法的是&#xff08; &#xff09; A. && B. <> C. if D. : 逻辑与&&语法规则&#xff1a;表达式1&&表达式2&#xff0c;其中两个表达式都是布尔表达式…

LeetCode453.最小操作次数使数组元素相等

LeetCode刷题记录 文章目录&#x1f4dc;题目描述&#x1f4a1;解题思路&#x1f4dc;题目描述 给你一个长度为 n 的整数数组&#xff0c;每次操作将会使 n - 1 个元素增加 1 。 返回让数组所有元素相等的最小操作次数。 示例1 输入&#xff1a;nums [1,2,3] 输出&#xff1a…

EduIQ Network LookOut Administrator

EduIQ Network LookOut Administrator 网络了望管理员允许您从屏幕的远端实时监视计算机。您可以随时看到他们在做什么。除了计算机控制&#xff0c;您还可以捕获摩西和键盘用户。使用Network LookOut Administrator软件可以完成一些有用的工作&#xff1a; 远程儿童计算机控制…

记录一次Gstreamer运行报错排查

背景 系统&#xff1a;Ubuntu 20.04 显卡型号&#xff1a;RTX 2060 之前正常运行的Gstreamer的编解码代码&#xff08;有用到显卡硬件加速&#xff09;&#xff0c;突然运行报错。经过一番折腾&#xff0c;最终找到原因&#xff0c;是因为NVIDIA驱动近期更新了&#xff0c;与…

Node.js——模块化(一)

1. 模块化的基本概念 1.1 什么是模块化 1. 编程领域中的模块化 1.2 模块化规范 2. Node.js 中的模块化 2.1 Node.js 中模块的分类 2.2 加载模块 加载自定义模块给相对路径 ./是平级&#xff08;同一文件夹下调用&#xff09; //这是07.test.js代码 // 注意&#xff1a;在使用…

Cypress笔记-连接命令

.each() 作用 遍历数组数据结构&#xff08;具有 length 属性的数组或对象&#xff09; cy.get(.connectors-each-ul>li).each(function($el, index, $list){ //遍历每个li元素console.log($el, index, $list)}).its() 作用 获取对象的属性值 示例代码 cy.get(.conne…

MergeTree概述

概述 Clickhouse 中最强大的表引擎当属 MergeTree &#xff08;合并树&#xff09;引擎及该系列&#xff08;MergeTree&#xff09;中的其他引擎。MergeTree 系列的引擎被设计用于插入极大量的数据到一张表当中&#xff0c;数据可以以数据片段的形式一个接着一个的快速写入&am…

DonkeyCar [02] - 软件配置 - 上位机(windows)

前言&#xff1a;在windows下配置Donkey Car的上位机&#xff1a; 1 安装miniconda Python Conda是开源的管理系统&#xff0c;Miniconda是conda的开源最小安装。 Donkey的默认安装版本&#xff0c;3.7&#xff0c;Miniconda已经是 最新的版本&#xff0c;是3.10.8吧&#xf…

IB如何选科更有助于大学申请?

如果你准准备选择就读IB课程体系&#xff0c;IB选科颇为重要的&#xff0c;选课对于提升自己的竞争力是非常重要的&#xff0c;可以说合理的选课&#xff0c;是申请外国大学的奠基石。IB课程不同于其他两种课程体系&#xff0c;它并不以某个国家的课程体系为基础&#xff0c;而…

02、Java 数据结构:时间复杂度与空间复杂度

时间复杂度与空间复杂度1 场景理解1.1 场景11.2 场景21.3 场景31.4 场景41.5 代码实现2 时间复杂度2.1 渐进时间复杂度2.2 从基本操作执行次数推导出时间复杂度2.3 两种方法来计算2.4 四个场景的时间复杂度分析2.5 大 O 表达式的优劣3 空间复杂度4 时间复杂度和空间按复杂度关系…

《计算机网络》——第四章知识点

第四章思维导图如下&#xff1b; 网络层向上只提供灵活的、无连接的、尽最大努力交付的数据报服务&#xff0c;主要任务是把分组&#xff08;IP数据报)从通过路由选择与转发从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务。 互联网可以由多种异构网络互连…

基于Shell编程完成定时备份数据库,看这篇就够了

一. 前言 最近文哥班里有一个学员面试成功上岸&#xff0c;在公司开发时遇到了这么一个需求&#xff1a;领导要求他编写一个shell脚本&#xff0c;完成定时备份数据库的需求。由于他对linux以及shell编程不是很了解&#xff0c;这位学员感到束手无策&#xff0c;于是就求助文哥…

List的介绍

目录 1.什么是List 2.常见接口介绍 3.List 1.什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。Collection也是一个接口&#xff0c;该接口规范了后续容器中常用的一些方法&#xff0c;具体如下所示 Iterable也是一个接口&#xff0c;表示实…

ArcGIS基础实验操作100例--实验11以线要素分割面要素(一)

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验11 以线要素分割面要素&#xff08;一&#xff09; 目录 一、实验背景 二、实验数据 …

今年十八,蓝桥速刷(Python-I)

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1f342;专栏地址&#xff1a;python专栏 抽根烟先 蓝桥杯是个啥 蓝桥杯&#xff0c;又称圈钱杯(不是 是由…

MySQL数据库调优

MySQL数据库调优一、MySQL架构设计1.1、引言1.2、MySQL Server层1.2.1、连接器&#xff08;Connector&#xff09;1.2.2、查询缓存 &#xff08;Query Cache&#xff09;1.2.3、分析器&#xff08;Analyzer&#xff09;1.2.4、优化器&#xff08;optimizer&#xff09;1.2.5、执…

Qt5操作Office及Word读写实例

欢迎小伙伴的点评✨✨&#xff0c;相互学习&#x1f680;&#x1f680;&#x1f680; 博主&#x1f9d1;&#x1f9d1; 本着开源的精神交流Qt开发的经验、将持续更新续章&#xff0c;为社区贡献博主自身的开源精神&#x1f469;‍&#x1f680; 文章目录前言一、Qt操作Office的…

云超融合数据中心 CloudFabric

大家好&#xff0c;我是技福的小咖老师。 随着云计算、大数据、人工智能等新一代信息技术的快速发展&#xff0c;数字技术已经渗透到我们日常生活的方方面面&#xff0c;同时也改变了所有行业。数据中心&#xff0c;将算力源源不断地输送给数字世界&#xff0c;逐渐成为云计算…

Flink学习28:水位线

1.前言 flink有3种时间&#xff0c;主要是事件时间和处理时间。 水位线主要解决&#xff0c;数据乱序到达或者延迟到达的问题 2.水位线原理 即只有当水位线&#xff0c;越过窗口的结束时间&#xff0c;才会触发窗口计算。 窗口计算需要同时满足两个条件&#xff1a; 1.水位线…