之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级为6.3.0。无论是Spring Security的风格和以及OAuth2都做了较大改动,里面甚至将授权服务器模块都移除了,导致在配置同样功能时,花费了些时间研究新版本的底层原理,这里将一些学习经验分享给大家。
注意:由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 spring-boo-3.3.0(默认引入的Spring Security是6.3.0),JDK版本使用的是19,本系列OAuth2的代码采用Spring Security6.3.0框架,所有代码都在oauth2-study项目上:https://github.com/forever1986/oauth2-study.git
1 示例说明
上面我们已经了解了OAuth 2.0的一些关键角色以及不同模式的流程。那么我们先从一个示例开始,这样我们更为深刻理解其工作原理。
下面我们把自己项目作为Client(客户端),通过授权码模式去获取Gitee的用户信息,那么Gitee就是Authorization Server和Resource Server。以下图就是要实现过程:
2 演示授权码模式获得令牌
我们先不使用代码的方式,演示一遍如何模拟客户端,使用授权码模式的方式,去获得用户信息。
1)首先,你必须注册一个Gitee账号,就如同系列一中一样,Gitee就是淘宝,你要先拥有账号才有你的信息。
2)其次,在github上面注册你的Client(第三方应用),也就是你的项目(就如同系列一中第三方分析应用)。注册地址:https://gitee.com/oauth/applications/new 。以下就是注册的内容:
注意:这里的回调地址为什么是这个,其实回调地址自己都可以随便写的。但是为了下一章使用Spring Security 6搭建客户端,因此设置Spring Security 6默认的回调地址(这个在第4章客户端的底层原理中会解释) 。
3)创建应用后,你会得到一个Client ID和Client Secret,这两个就是我们获得授权的关键,拷贝下来,后续授权码模式获得用户信息需要使用到。
4)我们先简单回顾一下授权码模式的流程
- A:**你(User-Agent)打开到Gitee(Authorization Server授权服务器)**的授权界面,**你(User-Agent)**点击确认授权
- B:**Gitee(Authorization Server授权服务器)**会返回一个授权码Code
- C:使用授权码Code,再次访问Gitee(Authorization Server授权服务器)去获得令牌token
下面 从第5)到第7)步就是模拟该流程:
5)打开浏览器,创建一个请求:
https://gitee.com/oauth/authorize?client_id=xxxxxxxxx&redirect_uri=http://localhost:8080/login/oauth2/code/gitee&response_type=code
其中参数client_id替换为步骤3)中获得的Client ID。
redirect_uri就是我们注册是使用的回调地址:http://localhost:8080/login/oauth2/code/gitee
如果你已经登录过Gitee,那么你会跳转到以下界面,如果你还未登录Gitee,则会先要登录Gitee。
6)上图中,你点击授权,你会跳转到一个新的页面,那就是我们设置的回调地址(虽然无法访问,但是没关系),同时你看URL会多了一个code参数,这就是授权码模式下返回的code
7)打开Postman工具,新建一个post请求,按照下图的请求后,你会获得一个access_token。至此授权码模式下获取令牌token已完成
8)获得用户信息,使用postman,将步骤7)中获得的令牌token,访问:https://gitee.com/api/v5/user,可以得到用户信息
结语:至此,我们就使用浏览器+postman工具演示了通过授权码模式去获取Gitee的用户信息。这过程中,我们只是遵循OAuth2的流程,就能够实现授权方法。那么接下来,我们采用代码方式来实现这个流程。