grpc、https、oauth2等认证专栏实战11:oauth2认证方式之授权码模式介绍

发布于:2022-12-21 ⋅ 阅读:(614) ⋅ 点赞:(0)

已发表的技术专栏(订阅即可观看所有专栏)
0  grpc-go、protobuf、multus-cni 技术专栏 总入口

1  grpc-go 源码剖析与实战  文章目录

2  Protobuf介绍与实战 图文专栏  文章目录

3  multus-cni   文章目录(k8s多网络实现方案)

4  grpc、oauth2、openssl、双向认证、单向认证等专栏文章目录


本篇文章主要介绍oauth2认证方式中的授权码方式

本次测试直接使用go-oauth2官方提供的测试用例介绍

已经上传到百度网盘了
链接: https://pan.baidu.com/s/1NXNhCTsum9nZxUmXkTrGug 提取码: mlbd

使用的oauth2的版本号是

v4.3.0

1、授权码测试

1.1、第1步:先启动认证服务器端、客户端

启动认证服务器端

$ cd example/server
$ go build server.go
$ ./server

启动客户端

$ cd example/client
$ go build client.go
$ ./client

1.2、第2步:用户登录

在这里插入图片描述

在这里插入图片描述

1.3、第3步:用户授权

点击完登录后,会跳转到授权页面

在这里插入图片描述

1.4、第4步:返回token

用户点击完授权allow后,会返回给客户端token

在这里插入图片描述

此时,客户端获取到acess_token后,就可以去访问资源方,如微信,获取相应的资源数据。

从上面的token,可以看出来,此token并非jwt类型的token

2、如何生成JWT类型的token

在认证服务器端一侧:

在这里插入图片描述

至于ca.key如何生成的,可以前面的相关文章。

设置token类型为JWT

在这里插入图片描述

在这里插入图片描述

如果是为了简单测试的话,可以不用提供私钥:

manager.MapAccessGenerate(generates.NewJWTAccessGenerate("", []byte("00000000"), jwt.SigningMethodRS256))

自己创建一个字节切片即可

3、授权码式    源码介绍

备注:

如果你对源码不感兴趣,可跳过

本次源码分析,会比较简单,不会像分析grpc-go那样几乎每行语句都分析。

只需要找到关键点,即可。

3.1、用户输入127.0.0.1:9094后,在客户端一侧发生了什么

在这里插入图片描述

设置认证服务器反馈token类型

在这里插入图片描述

在这里插入图片描述

此处的code,表示授权码。认证服务器端一侧,会创建授权码

退出,此方法;

在这里插入图片描述

客户端发起请求时,必须携带自己的ID号,这个ID号是在资源方(微信一侧)进行注册过的。

为了解密具体的重定向地址,因此,需要进入http.Redirect方法里:

在这里插入图片描述

在这里插入图片描述

进入认证服务器端

认证服务/oauth/authorize 接口处理器

在这里插入图片描述

点击srv.HandleAuthorizeRequest

在这里插入图片描述

点击s.UserAuthorizationHandler(w, r),其实调用的是

在这里插入图片描述

在这里插入图片描述

login接口

在这里插入图片描述

打开登录页面

在这里插入图片描述

在这里插入图片描述

3.2、用户输入用户名,密码,点击login后,发生了什么(即用户登录后,发生了什么)

在这里插入图片描述

在这里插入图片描述

r.Form.Get(“username”),得到是登录页面用户输入的用户名,如admin
最终,存储到session的LoggedInUserID里,

这样用户授权时,就可以从session里获取到相应的userID数据了。

auth接口

在这里插入图片描述

打开授权页面

在这里插入图片描述

3.3、用户点击allow后,会发生什么(即用户授权后,发生了什么、用户同意csdn获取微信里admin账号的相关信息)

/oauth/authorize接口

在这里插入图片描述

在这里插入图片描述

272行里,获取到的userID, 就是通过用户登录时存储到session里的LoggedInUserID获取到的。

注意

授权码模式下,go-oauth2提供的测试用例中是用session来存储这些信息的。
创建授权码,创建token都需要userID

在认证服务器端,开始创建授权码

进入到GetAuthorizeToken方法里

跳转到最后一行,

在这里插入图片描述

进入GenerateAuthToken方法里

在这里插入图片描述

真正的创建授权码

在这里插入图片描述

从认证服务器重定向到客户端的oauth2接口

在这里插入图片描述

进入到客户端一侧:

在这里插入图片描述

好,进入Exchange方法里:

grant_type设置了创建token的类型,为authorizaiton_code类型,

认证服务器端,会解析grant_type字段,根据字段的值触发相应的业务

在这里插入图片描述

注意:

code值(授权码),认证服务器端同样也会校验

在这里插入图片描述

从客户端一侧,再次重定向到认证服务器的/oauth/token接口里,目的是获取token

在这里插入图片描述

此时,进入认证服务器端,认证服务器开始创建token阶段

在这里插入图片描述

在GetAccessToken方法里,对授权码进行了校验,并删除授权码、创建token。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

base64方式编码来生成token

在这里插入图片描述

jwt方式编码来生成token

在这里插入图片描述

无论是base64类型的token还是jwt类型的token,都封装了用户的ID,以及客户端ID,

当客户端(简书、CSDN)向资源方(微信)发起获取资源数据请求时,

微信一侧,会解析token,解析出用户ID,客户端ID,进行校验,满足条件就反馈相应用户的资源数据
否则,不给。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

下一篇文章
  oauth2认证方式之密码式介绍


网站公告

今日签到

点亮在社区的每一天
去签到