同样基于密码模式的代码
先看完我的客户端模式和密码模式,服务跑起来了再看授权码模式
1. 验证服务器的配置类中改一点
2. security配置类改一点
http.authorizeRequests()
.anyRequest()
.authenticated() //所有请求都需要通过认证
.and()
.httpBasic() //Basic提交
.and().csrf().disable()
.formLogin() //支持表单认证
.permitAll();
资源服务器不变,到这已经配置好了
流程:
比如登录请求要认证,会拦截 oauth/authorize 这个端点,这个是请求授权码(code)的
我们的后端服务器A收到比如qq登录的请求
后端自动先把我们请求302跳转(导向)到验证服务器(同理就是qq的验证服务器)去请求 code
请求code
http://localhost:9930/oauth/authorize?response_type=code&client_id=admin3&redirect_uri=http://www.baidu.com&scope=all&state=normal
浏览器就会跳到这里
然后你输入这里写的用户名密码user1,123456
你们看这一步是不是对应的qq登录页面啊
然后输入密码登录后,这就是授权页面啊对不对
QQ把登录和授权页写在一起了而已,只不过security框架分开了,它有自己的页面
其实我们也可以自定义页面的,可以百度下
这里显示是否授予admin3权限,点第一个按钮,同意授权
然后他就跳转到我们设定的百度页面来了,因为验证服务器的配置类中我们授权后设定了跳转到百度
这里可以写我们自己的后端服务接口,比如授权后跳到登录成功的首页
然后这时 code 咱们也有了
怎面看,它跳转到百度的时候,code会自动加在url后面的,还有state参数
如果你是拒绝授权,它会跳转但不会有code参数
这里拿到code了
前端再用code去请求验证服务器拿Token
http://localhost:9930/oauth/token?grant_type=authorization_code&code=e5crHP&client_id=admin3&client_secret=123456&redirect_uri=http://www.baidu.com
打开浏览器访问,就有Token了,注意:这个code请求过token一次,code下次就无效了
第二次请求Token,出现这个说明code失效了
我们就拿token访问资源服务器的资源
qq就是获取头像,获取个人信息这些
然后也可以用token获取刷新token(不需要code)
http://localhost:9930/oauth/tokengrant_type=refresh_token&refresh_token=xxx&client_id=admin3&client_secret=123456
这就是授权码模式了