已发表的技术专栏(订阅即可观看所有专栏)
0 grpc-go、protobuf、multus-cni 技术专栏 总入口
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认证方式之密码式介绍