00:01
我们继续处理接下来的逻辑,那前面呢,我们可以拿到这个code,这个code呢,最终被我们进行处理,要使用code来换取access token,我们使用这个工具呢,也将这个请求发了出去,来换取access token,那换取来access token以后怎么办呢?我们先来看一下换来的access token长什么样,好,我现在还是来点击我们的登录请求,社交登录,然后登录过来以后呢,因为我们以前微博登录过,所以我们直接也不用去登录页了,我们直接拿到一个token token呢就是这样来to value,我们这个先用postman,我们来测试一下我们拿到的这个code,然后我们要获取access token,那我们需要来我们的回调一页,地址我们变了,我们现在叫author,古励m com,我们的author to,微博success crl c,我们来在这儿写一下,好,我们现在先来换取一个走。那我们换取来的X talk呢,其实长的是这样,也就是一个杰森字符串,那当我们这个请求运行完成,那么这个POS请求一发出去以后,如果它成功,就应该换取来我们的X ton这个结算串,所以呢,我们先来处理一下,那么团断它是否换取成功,在这个post,这是我们的响应response,我们就叫response,我们的这个响应里边,它呢是首先有一个方法叫get status line获取我们这个响应状态,行,这行里边呢,有我们的应状态嘛,那如果成功,那就是200,所以呢,如果他。
01:34
如果它呢是等等200的,那说明我们这个响应呢就是成功的,那成功呢,那说明我们这个获取到了咱们这个access token,如果不成功,那就各种原因,好我们写一个else,那不成功相当没获取到,没获取到给他重定向到登录页,让他重新来登录,就来说一个登录失败,好我们现在来重定向到这个登录页,就叫o sir点一个它下边的login.htmmr,好现在呢,我们在这如果是成功,就要获取an ton ans token呢,其实是它的响应题内容,Response里边我们有一个东西叫get entity能获取到它的这个响应实体,当然我们这个响应实体呢,是一个接s jas呢,其实就是这个数据我们可以转换成一个对象,好,我们先来转换过来,再来说它有什么用,那我们现在呢来转换,转换呢,有一个工具类叫nt us,那这个安化奇提供的这个实体工具类。
02:34
这个工具类呢,有一个方法叫突丝串,它可以把我们HTN相当于这个实体类变成一个我们的这个字符串,相当于它能把我们这个实体类的响应体内容拿过来,所以我们就来从response里边,我拿到我们的这个HTV响应的内容,这一块内容呢,它就会变成我们这个string,这个string呢是一个jas,那把这个jas呢,变成我们对应的这个对象,这个对象呢应该是长这个样,好,我们直接给它逆转一下。
03:05
我们随便呢,使用一个杰森,咱们这个格式化工具,他们呢都可以拥有咱们这个逆转功能,好我们在这呢,有一个杰森,我们来找一个我们的杰森转Java的,这个转Java实体类,好我们把我们的杰森数据拿过来,让他帮我们来转一个实体类,这实体类的名字,那我们就叫social,那现在呢是社交登录的,那我们就叫social user吧,好,User,那这是我们这个社交用户,社交用户呢,我们这个包名com at硅谷,那我们把我们的这一块报名我们都复制过来,CTRLC,好完整的报名是叫这个author com.at硅谷author。tom.an硅谷点。鼓励mail.author好,我们现在是这个社交用户来生成扎B,我们把这个B呢,我们直接复制过来,CTRLC。
04:00
我们来创建一个我们的这个VO,好,我们还叫VO,这个VO呢,我们就叫social user,好我们这个社交用户,这个社交用户里边呢,有我们相应的这几个内容,把这几个呢,它复制过来。我们只要它的这个属性名CTRLC来复制过来,然后呢来给它标上data方法。然后呢,这些属性我们有了以后,我们就希望我们最终呢,换取来的这个token,这是一个杰森字符串,我们将它呢转成我们指定的这个对象,好,我们使用fast JA提供的这个Jason,点一个pass object,我将我们的这个Jason字符串来转成我们指定的类型,就是这个social user。好,我们就叫soso user,好,我们来转成这样类型的一个对象,只要它能转过来,那说明我们这个就是成功的啊,我们还是给这儿打一个断点,那以debug模式来重新启动它。
05:01
来看一下我们的社交登录完整流程,那我们可以先把这个微博退出一下,那在这来点击退出功能,好我们现在呢来完整的来进行我们的登录流程,那现在呢要做的就是我们先来点击登录,来到这个登录页来稍等我们这个服务启动成功,我来刷新一下,好,我们现在来点击我们这个社交登录按钮微博,好,我先来输入我们的微博的账号密码,然后再来输入我们的验证码,我们来点击登录,点击登录以后跳到我们的这个页面,那我们现在呢,是这个登录成功回调是这个success,然后我们最关键的一步是要换取access talking,好,我们来等一下,好,这一块呢,请求执行完我们的状态码是200,我们响应成功的,所以我们这一块判断是进来的,然后我们拿到它的杰森数据,我们来看一下这个杰森呢,封装了token这几个属性,好,我们把这几个属性呢,转成这个对象,我们来看一下,能看一下这个social user这个对象。这个我们转过来的这个对象,那现在呢,它就应该拥有我们指定的这些属性,我们来给它放行,那这个对象我们这儿呢,就是封装成功了,但封装成功了以后该怎么做呢?那这真正获取来了access token,那就成功了,我们就直接跳回登录页,告诉他呢,谁谁谁登录成功了,但接下来要做的事情就是我们在这既然拿到了access token,相当于我们知道了当前是哪个社交用户,知道当前是哪个社交用用户,那真正的是不是要登录成功,现在还得分情况,现在我们系统呢,现在是这样的一个情况,如果我第一次使用这个网站,比如鼓励商城,我第一次用我的微博账号进行社交登录,相当于呢,他会将这个社交用户先注册到我们这个网站里边,先有一些这个用户的默认信息,那以后只要我们这个社交用户注册进来了以后呢,都是用当前这个用户信息,所以我们来说这一块关键就是。
06:58
如果当前登录的这个社交账号,这个用户,当前用户如果是第一次,第一次进我们这个网站,然后呢就自动注册进来,注册进来呢,相当于跟我们这个会员的这张表来进行关联,我们得知道这个社交用户属于哪个会员,因为后来呢,跟会员的好多信息都在我们在这儿保存着,比如会员的等级,会员的收货地址等等这些消息,我们如果不为这个社交用户生成一个会员信息记录。
07:29
那么这些会员所有的收藏的东西,保存的东西都不会存在,所以呢,我们在这儿还要自动注册,它的逻辑呢,就是为当前,为当前咱们这个社交用户,社交用户生成一个咱们这个叫会员信息账号,以后呢,这个社交用户就关联这个账号以后。只要是我的这个社交用户,我是用175这个手机号登的以后这个账号,这个社交账号,社交账号就对应就对应我们这个指定的会员。
08:09
而且呢,以后你拿这个社交账号登录进来,我也得知道你是哪个会员,所以我们第一次呢,可能要处理这个注册功能,那这个注册怎么注册,我们可以看到在我们返回的这个信息里边,来参照我们微博的社交登录文档,好来在这一块文档里边来找到它的这个奥兔,奥兔下边的这一块文档,我们来看我换来的这个token,返回的这些值,我们都看他有什么解释,我们返回的这个X token,他说这是我们用户授权的唯一票据,而说我们只要拿到了当前用户的X token,我们可以知道他微博的所有信息,而且通过它来识别我们用户的登录状态,那相当于用户只要登录了就有token,没登录那就没有,然后呢,还有几个属性,一个字叫。这个东西呢,是我们这个unton的生命周期意思,我们这个授权的令牌多长时间以后过期,然后还有这个remain in,这个东西呢,我们说这个参数呢,就废弃了,用这个是一样的,好,我们这个不用管,还有接下来的这个UID,这个UID呢,是授权用户的UID,这是为了方便我们这个开发者,要说我们这个微博在返回安斯托N的时候,还返回了一个ID,但这个UID是固定的一个用户,他对应的UID都是一定的。
09:32
但是呢,UID不能作为登录状态的识别,因为呢,你只要过了很久以后登录它的X token就变了,但是它可以识别我是当前哪个用户,这是固定的,所以呢,我们接下来就要向他建立社交账号用户跟我们当前系统用户的关联,假设社交账号这个用户对应的就是我们系统数据库里边,比如我们一号记录我们雷锋阳这个用户,那雷锋阳不是用社交账号登录进来的。
10:00
所以呢,我们想要用社交账号来建立关联,我们第一次我们就得来做这些事情,那怎么做呢?我们现在就得来判断,把这个社交用户传过去来判断,如果这个社交用户从来没有注册过我们这个网站,我们就给他注册,如果注册了就查出这个用户的详细信息,比如他的会员等级是多少。他的头像等等这些我们之前设置的这些信息是多少,查出来给我们返回,所以呢,我们希望远程有一个方法,因为所有的会员服务都要调用我们的member方法,那么就希望我们的这个member service,我的远程服务能有一个方法接收我们这个社交用户,然后呢,他来判断是登录还是注册,所以我们在这要做的就是登录或者注册,或者注册这个社交用户,那我们接下来流程图这一块最关键的位置,那就是我们的第八步,那第七步我们要处理这个登录回调,登录回调的处理,那就是判断是这个社交用户是要登录还是注册,判断这个社交用户是否第一次,第一次登录,如果是,如果是就要进行注册流程。
11:16
这个注册流程呢,也不用用户填写那么多信息,我们给他自动注册,相当于关联上我们某一个用户的信息,哎,他这个社交用户,社交用户一定要关联一个系统的。本系统的咱们这个账号信息好,所以呢,我们是如何关联,就是用它的UID,因为无论X token是什么呀,只要同一个账号登录,它的UID都是一样的,我的这个用户ID永远都是这个好,那么现在呢,就来做这个事情,那现在来希望member服务就有这么一个功能,那member服务呢,之前有一个controller是来进行登录的。这个登录呢,传了一个member VO,现在呢,我们再来给它加一个功能,还是我们的社交登录,好我把这一块呢复制过来,那么这个登录呢,只不过加了一个功能叫OC来,我们现在呢是社交登录。
12:14
那我们这个社交登录呢,我们传入的是我们的这个社交用户信息,那我们把这个social user,我们就直接给它放到我们的common里边,好我们让大家都能用的这个社交账号里边,这有一个social user,或者我把它复制来,我呢给我们的这个member的VO也放一个,我们可以接收社交用户信息,好我们接收来这个用户信息以后,我们在这来处理一下,就叫social user。然后呢,这是我们的社交账号,然后我们调用社交账号的登录方法,最终返回一个真正的用户信息,我们希望有这么一个方法,我来创建一个重载的方法,好我们来再来创建一个我们这个muscle的log in,好这个登录呢,我们是使用社交账号来进行登录的,好我们来添加上它的这个实现,跟以前的这个登录呢不一样,那么这个社交账号登录呢,它是具有登录和注册合并逻辑。
13:18
那现在先得判断我们这个用户到底以前用过没有,因为这个社交用户里边有一个唯一的识别是这个UID,这个UID是这个社交账号,我们当前登录这个用户,他在这个社交网站的这个ID,他在微博里面的ID,跟我们系统如何建关联,其实很简单,我呢假设给这个member表里边来,我们本应该再创建一张新表,那我呢就不做这么麻烦了,我先来改变表,我给这里边呢再多添一个字段,比如呢我就叫UID,这个ID呢,我们就认为这是社交账号的这个ID,好,我们在这来写一下,我们呢为了区分我们就叫social u ID,然后呢,我们在这来写一个ver char类型,然后这个呢长度。
14:04
那先写个255,这一块呢,也不一定是非空的,我们留在这儿。因为有些呢是在我们系统里边注册过来的,有些呢是用社交账号注册过来的,所以我们把社交的相关信息我们都留在这儿,一个呢是我们这个用户ID,另外一个比较有用的是它的access token,好我们可以留一个,剩下我们就可以不要了,来写一个workar,好workar呢我们来写一个255,包括如果我们想要过期时间,我们可以拿一个来,这个过期时间,这个anis token主要在多久以后过期,好把这个过期时间拿过来,这个时间呢是一个数字,我们也直接用这个work差来进行替代就行了。好,我来写一个255,那这一块的这个批注搜索ID,这是我们这个社交。用户的唯一ID,这个ID呢是在社交网站对应的,然后呢,X token,我们的访问令牌来为了方便我们也要保存下来,还有我们的这个express in,我们这个访问令牌的过期时间,好我们就给数据库里边多加上这三个字段,那有了这三个字段,那我们给扎B里边也来添上这个,那我们会员的这个实体类里边,那么就来再添上这三个属性,我就不用逆向生成了。第一个属性是我们的access token,好我就直接这搜索UID我拿过来,因为我们开启了陀峰命名,就直接这么来写搜UID,这是我们这个社交账号的唯一ID,然后呢,还有private string它的这个访问令牌。
15:41
我们把这个东西呢,跟某一个用户直接建立起一个唯一关联好访问令牌,然后呢,接下来再来一个string,这个string呢,我们就叫它的这个过期时间,这个过期时间好拿过来好,这是一个过期时间。
16:00
当然这个过期时间是浪类型的,我们也可以直接把这个呢,让它接收的时候转成一个浪数字也没啥问题,那我们有了这几个,我们就来到我们的登录服务里边,那么使用社交账号来进行登录的时候,那先来看,假设呢,我们这儿有一个用户来,那么这儿呢,有一个用户是四号用户,他呢是二号等级的,但是他是通过社交账号登录过来的,所以他这一块呢,就应该有一个他的这个社交账号的这个UID,假设他的这个ID呢是123,所以呢,我们就是先来看我们这个有没有一条账号信息,比如这个四号信息,它的社交ID就是我们当前的这个,如果有说明他以前呢登录过,我们给他注册进来,如果没有,那就没登录过,所以呢,我们在这儿先要做的第一个判断,判断当前这个社交用户,社交用户是否已经登录过系统。
17:01
也就是是否在我们这个系统里边注册过,怎么注册过呢?就拿它这个UID判断好,我们拿到这个do member的这个do我们直接来去查就行了,CTRLC,好,我们在这来查我们这个member do我们直接来查一个数量就行了,Select count new,一个query waper好,我们现在来查我们这个member entity,我们这个member实体类们的查询条件,就是呢,我们这张表里边有一个社交用户的这个VID,搜索UID,如果这个UID正好是我们这个社交用户,我们通过那个扣德码换取来的token,这is token对应的这个UID,如果正好呢是它,而且统计出来有数量,那说明我们这个用户呢,之前注册过,如果if我们的这个count social u ID就叫count,如果这个的数量统计大于零,那说明呢,我们这个有用户,这个用户。
18:01
这个用户注册过,这个用户已经注册了,那在数据库里边就有这个记录了,那我们要做的是什么?我们唯一要做的呢,就是重新给他更换一下令牌,因为我们换了新的令牌了,那这个令牌的信息就是我们新的换来的令牌和它的过期时间,我来给他换一下,所以呢,我们现在只需要来更新一个我们的这个时间,那怎么更新呢?我们来先来创办一个member ENT,我们先来创建一个它,那将要更新它,你有一个member entity,那为了方便我们按照主键更新,我们可以把这个select count,我们来变为一个可以来查出我们这个真正内容的,我们就叫select list,好,我们来查出这个数据,如果有数据。因为如果有这个社交用户也可能只有一个,所以我们可以直接调用select外来查出这一个社交用户,如果这个用户呢,不为空。我们这个member,如果我们这个member,如果member不等于no,说明呢,我们数据库里边有这个,我也不统计数量了,说明这个用户已经注册了,注册呢我们接下来就给他修改一下它的内容,那修改什么呢?这一块呢,有它的主键ID,我们按照主键给他修改number nity,我们来创建一个新的要修改的这个东西,那就叫member entity,主要呢,我们要修改的字段,我们来放上去一个update.set它的主键是什么?们先来把当前用户的ID拿过来,我们按照ID好进行修改set idd呢,就等于我们刚查出来的点一个getd,我们现在呢,要修改它这几个字段。
19:36
好,第一个是set它的access token,我们新拿了一个access token就在这里边封装着呢,点一个get access token,好接下来我们第二个update,点一个set,我们的X片in们的过期时间也在这里边封装着呢,好,我们来点一个get的过期时间,那这块都放好以后呢,我们就来进行更新member do点一个UPDATE8ID,那按照ID进行更新,而且呢,如果有了就更新,如果没了呢,我们这个字段只设置了三个字段,按照ID这个字段更新这两个值啊,并且呢,我们要给它返回我们这个member这个实体类,因为我们这个登录成功了,这个用户呢,已经注册过了,那用户的真正信息,那就是这一块的,所以我们给他返回我们刚查出来的这个用户信息,当这个用户信息此时的这个令牌数据,我们也给他放上我们新的令牌access token。
20:34
那就是我们这一块的内容,以及它的这个过期时间,NT点一个set X per,好把这个过期时间呢都放上。走,那这是我们的用户已经注册,否则那就是用户还没有注册,那第一次登录我们去数据库呢,没有查到这个社交用户对应的记录,所以我们在这呢,就要进行注册啊,没有查到当前社交用户当前。
21:04
社交用户对应的记录,我们就需要注册一个,所以呢,我们来注册,我们就来写上一下,我们要既然要进行注册,那么就来创建一个entity,我们来给它里边进行保存就行了,这些呢,我们要注册的这个用户,那你有一个member en,因为这个社交用户也不需要指定密码什么,人家是用社交账号来进行唯一关联登录的,所以呢,我们要设置的字段就是它的这个等级ID,设置一个默认的,当然大家也可以用token查出我们这个社交用户对应的昵称nickname是什么,还有其他信息是什么,我们都可以来查出来。那么接下来可以来做第三步,我们来查出查询当前社交用户。的社交信息,社交账号信息,这个信息包括它的昵称,还有咱们这个性别等性别等我们当前系统的这些昵称性别的设置,我们可以跟他的这个社交账号对应起来,那我就来用http us们来进行一个查询,这怎么查询呢?我们之前正好用过我们来获取用户信息,在微博里边是我们这个方法发送一个get请求,然后呢叫user show,带上access token和带上用户的UID来进行查询就行了。好,我们接下来把这一块的路径我们来拿来是我们的,这是我们的域名啊,要发一个get请求,点一个get。
22:39
那get请求先来主机地址,那是这个,然后呢,再来写上一个路径,我们把这个路径正好呢,这是查用户信息的路径,好把这个路径我们拿过来,然后呢,再来加上我们来看一下,它还要传入我们的请求方式,这个请求方式我们肯定是get,那么就在这儿再来加上我们的请求方式,这个登录里边请求方式来写一个get,还有我们的请求头,这头呢没数据,但是它还必须是一个not,那我就直接new一个哈希map放在这就行了,这map呢是string string类型了。
23:18
然后呢,我们再来放一个我们张真正的我们查询的参数,我们这些查询参数呢,我们就来准备一个map,来写一个map string,那么这个呢,Map。我们就叫cor瑞等于谬一伽哈西曼。好,我们准备来进行,用它来做一个查询,这是我们的查询字符串,当然它有异常直接往出抛就行了。走。来看一下,现在呢,我们在这来要进行查询,我们一定要提交两个参数,第一个put put,我们的这一块叫access to,我们以前测过使用它,它呢对应的值,那就是我们带过来的social里边的这个access token,好,我们上一次呢已经拿到这些具体信息了,然后呢,接下来继续点put put呢,我们接下来还要放一个u I Du,我们查这个用户的这个u I Du ID是什么,那接下来我再来传入我们social user里边的get u ID。
24:22
好,那现在呢,我们在这就能查出我们这个用户的详细信息,这用户的详细信息呢,我们可以拿过来,Response,我们当然应该判断if response,如果response.get status line,点一个get status code等于200,那说明我们这个是查询成功的,查询成功,那这个查询成功我们就应该将信息封装过来,那使用nt us。点一个to string,我们先把response里边的完整内容response,点一个get entity,把它的整个完整内容拿过来,这是一个杰森,那这个杰森呢,就应该返回的是我们这个样子的,那这个样子呢,它肯定是一个复杂对象啊,我觉得太麻烦了,我们再来转对象,现在第一次就想用它的一些基本信息,我们可以使用这个杰森工具,我们来直接调用一个叫pass object,把它转成一个阿里巴巴fast杰son的这个杰森object,直接把我们这个杰森字符串转成我们这个杰森object对象,然后呢,这个对象里边我们想拿什么都可以拿,比如我们现在想要获取到它的一些信息,那在这就可以调用方法,比如我来get string来想获取第一个我的这个微博的昵称,那我们这呢,还有比如我们的name,这不就是我们的名字吗?比如我们把这个名字就当我们的默认昵称,好,我来点一个get name,这是我们的。
25:53
好,这是我们当前这个社交账号对应的昵称,然后呢,接下来我们其他的我们都可以来获取,比如它的性别点get,我们还是获取一个string这个性别呢,这有一个真的是MF的啊,我们就来整一个。
26:12
我们来获取真的它的这个值,这是我们的性别,然后呢。等等等等,其他各种要获取的,大家都可以在这获取,然后我们接下来就要注册,那我们要进行注册,我们就来可以给他设置,设置它的默认昵称,那就是我们社交账号的昵称,然后呢,包括我们来设置它的这个性别,点一个,比如我们来set一个真的。只不过呢,我们这个真的里边传的是零和一啊,我们这个社交账号里边返回的是MF,那么就来判断一下,我们现在呢,返回的这个真的,如果这个真的不等于空,我们先拿这个M来判断,M点一个equals。真的,如果呢,真的是这个M,我们来判断写一个三热运算,如果是一个M,我们来写一,否则呢,我们来写零,哎,我们来保存这个男女关系,好现在放在这儿,那其他的所有信息都可以在这获取,等等等等,大家呢,全部可以在这尝试,我就不挨个获取了,参照我们返回的这个数据,我们之前的返回数据,我在这儿来获取其他信息,比如他的这个头像地址,大家也可以来设置上去,那这一块的信息都放好以后,我们主要在这里边再来保存上这几个信息,第一个set它的UID,当前我们这个社交用户的这个UID,这个UID呢,我们一定要拿来在数据库,我们要建起一个关联,因为防止下一次我们还是这个用户登录,我们就不用再来做注册了,还有我们的access token,它这次访问的令牌,把这个也拿来,这是他这次的令牌,还有这个他这次令牌的过期时间点1SET X撇in好这个令。
27:55
品牌的过期时间我们也可以拿过来,好,这一块我们都准备好以后,我们将这条记录来进行插入就行了,这是我们的要注册的用户,那么来进行插入,当然那要插入之前,我们除了这几个是关键的,剩下的这三个我们来远程查询他的这个社交账号信息,这个呢,万一我们这个网络不通的情况,我们远程查询不成功,也应该不影响我们这次的社交登录它的其他信息,所以呢,我们可以把这一块做一个try catch,即使出现问题了也没关系,好来串,只要这一块呢,我们来远程查询它的这个社交信息,他的一些昵称等,即使有问题我们也不用管,好不用管,然后呢,关键性的就是这几个当前社交用户的UID是什么什么,我来准备好一条记录给数据库里边一插,以后只要这个社交用户第一次登录数据库里边就有一条记录,相当于他就注册进来了,好。
28:55
我们现在来调用member do点一个insert的方法,然后呢,将我们这个实体类来插进来,那插入进来以后呢,这条记录就插入成功了,那插入成功以后。
29:08
那我们这个用户也就登录成功了,那登录成功我们就将这个实体用户我返回出去就行了,那这一块的return我们就可以不用写了,所以我们的这一块社交登录是两个合并逻辑,一个是登录,他登录过就进行登录,没登录过就进行注册。注册的目的就是为了保存当前这个社交用户在我们数据库对应的是哪个用户ID,相当于保存这个用户ID和社交账号ID对应的关系,因为我们这个数据库里边以后保存所有这个用户的一些信息,用户的等级也好,用户收藏的这些商品也好,我们都是根据用户ID关联的,所以我们一定要为这个社交用户生成一个用户ID,我们自己系统的用户ID。好,那么下一节课呢,把它来做一个整体测试,我们主要呢,编写了这么一个流程,就是在我们的这一块判断是否第一次注登录,如果没有的话就进行注册,否则呢进行登录,那无论是注册成功还是登录成功。
30:11
那么这个商城呢,最终都会返回一个我们当前的这个用户,诶,我们来返回当前用户。好,我们第九步无论是登录成功还是注册成功,那都是返回,返回我们当前用户。当前用户信息,你返回了这个用户信息,我们可能在首页要进行展示,诶欢迎谁,诶这一块登录成功了,那就写个欢迎回来等等等等,好,我们下一节课来做一个整体测试。
我来说两句