述
上文中,了解了 Spring Security OAuth 的一个大致的流程,本文将我们之前写的用户名密码登录的方式重新修改一下,让他登录之后也返回一个token, 后续请求都通过token来请求
实现思路
我们在用户名密码等登陆认证完成之后,会生成一个已认证的 Authentication
对象, 看一下图中的 Authentication
这里,也就是说我们再搞到一个 OAuth2Request
对象,就可以用他后面的逻辑去处理生成了,大致流程图如下
这里就是在登录成功之后,在登录成功的处理器里面,从请求中获取到basic client的信息,然后去获取 ClientDetails
的信息, 虚线框住的部分是需要我们自己去实现的
具体实现
我们最终是希望拿到一个 OAuth2Request
对象, 如图,得先通过 ClientDetailsService
获取 ClientDetails
,所以第一步得先从请求中把 ClientId
拿出来
之前我们的请求头中有 Authorization:Basic dGVzdEFwcGlkOnRlc3RTZWNyZXQ=
我们只要把这个拿出来做解析就可以拿到 clientId
了
BasicAuthenticationFilter
中有一段解析的代码, 如下:
把这两段代码直接复制到我们的成功处理器里面,然后做一些修改即可,如下:
1 | @Slf4j |
这里主要是先获取 client 的信息,然后一步一步往下创建对象就可以了
资源服务器的配置
现在项目里的一些登录路径什么的都没有做配置,所以在资源服务器的配置类里还需要做一些配置
1 | @Configuration |
直接先把浏览器的配置拷过来,然后去掉一些浏览器特有的配置,后期再改
测试
启动项目,访问用户名密码登录的接口 /authentication/form
,效果如下:
可以看到,这里已经成功返回token了
短信验证码登录
如果之前的验证码是放到 redis 中的话,短信登录现在也是可以正常使用了的,如果是使用的 session 的方式,那还需要做一些修改,因为在App的请求中是没有cookie的,也就没有JSESSIONID, 也就获取不到session, 具体修改这里就不说了