OAuth2协议规范了4种获取令牌的方式:授权码模式、密码模式、客户端模式和简化模式,具体可以参考[https://tools.ietf.org/html/rfc6749#section-4.1](https://tools.ietf.org/html/rfc6749#section-4.1)。Spring Cloud OAuth2在此基础上添加了刷新令牌方式,所以这里将演示下这5种获取令牌的方式。 ## 准备工作 为了方便,我们先在管理界面的“客户端管理”中,新建一个支持这五种模式的client: ![Ye8hwT.png](https://s1.ax1x.com/2020/05/07/Ye8hwT.png) 上面我们新建了一个支持这5种模式的client,client_id为code,client_secret为123456。 ## 授权码模式 授权码模式演示需要有个前提,那就是网关和认证服务器的域名(或者ip地址)一致,这样通过网关跳转到认证服务器的登录页面后,session才不会丢失(不同域session不会传递)。要保持一致,只需要使用本机局域网ip地址即可(不要用localhost或者127.0.0.1),查看本机局域网IP: ![YeNrxH.png](https://s1.ax1x.com/2020/05/07/YeNrxH.png) 我的IP为192.168.73.106。不知道自己IP的可以通过下面这段Java代码获取: ```java InetAddress address = InetAddress.getLocalHost(); String ipv4 = address.getHostAddress(); ``` 使用浏览器访问:[http://192.168.73.106:8301/auth/oauth/authorize?response\_type=code&client\_id=code&redirect\_uri=http://www.baidu.com](http://192.168.73.106:8301/auth/oauth/authorize?response_type=code&client_id=code&redirect_uri=http://www.baidu.com) 1. response_type=code,表示授权码模式; 2. client_id=code,为准备工作中创建的client_Id; 3. redirect_uri=http://www.baidu.com,为准备工作中创建的client_id为code对应的重定向地址。 访问后,页面跳转到认证服务器提供的登录页: ![Yeab5V.png](https://s1.ax1x.com/2020/05/07/Yeab5V.png) 输入用户名和密码,点击登录,页面将重定向到上面指定的重定向地址,并且会携带相应的授权码: ![YedA2D.png](https://s1.ax1x.com/2020/05/07/YedA2D.png) 复制这个授权码,使用postman发送如下请求: ![Yed0iV.png](https://s1.ax1x.com/2020/05/07/Yed0iV.png) ![Yed6sJ.png](https://s1.ax1x.com/2020/05/07/Yed6sJ.png) 点击send,成功获取了令牌: ![YedjFP.png](https://s1.ax1x.com/2020/05/07/YedjFP.png) ## 刷新令牌模式 我们使用授权码模式获取的refresh_token来演示如何刷新令牌: ![Ye0ph6.png](https://s1.ax1x.com/2020/05/07/Ye0ph6.png) ![Ye0aCV.png](https://s1.ax1x.com/2020/05/07/Ye0aCV.png) ## 密码模式 密码模式在[https://www.kancloud.cn/mrbird/spring-cloud/1268278](https://www.kancloud.cn/mrbird/spring-cloud/1268278)一节中已经介绍过了,不再重复赘述。 ## 客户端模式 客户端模式最为简单,只需要提供client就可以获取到令牌: ![Ye0IDH.png](https://s1.ax1x.com/2020/05/07/Ye0IDH.png) ![YeBkGV.png](https://s1.ax1x.com/2020/05/07/YeBkGV.png) 可以看到,只需要提供client就可以获取到系统令牌,并不需要输入用户名密码。但是这也说明了通过这种模式生成的令牌,只能获取需要认证的系统资源,涉及到权限的资源无法获取。 此外,从返回结果来看,该模式不支持刷新令牌模式。 ## 简化模式 简化模式简化的是授权码模式流程。使用浏览器访问:[http://192.168.73.106:8301/auth/oauth/authorize?response_type=token&client_id=code&redirect_uri=http://www.baidu.com](http://192.168.73.106:8301/auth/oauth/authorize?response_type=token&client_id=code&redirect_uri=http://www.baidu.com) 访问后,和授权码模式一样,页面将跳转到认证服务器提供的登录页面,输入用户名和密码后,页面重定向到指定的redirect_uri中: ![YericT.png](https://s1.ax1x.com/2020/05/07/YericT.png) 可以看到,重定向后,地址栏已经包含了访问令牌。由此可见,简化模式简化了通过授权码去换取令牌的过程。