研究了好久的springCloud微服务架构,在这里整理总结一下,做个梳理和备忘。
这次总结的是微服务之间的认证。最近实现了一个基于spring security的适合单体应用和分布式应用,适合app和浏览器的一套自用鉴权框架。算是对spring security有了点比较深入的认识了,这里说一下通过OAuth2+JWT来解决微服务之间的鉴权问题。
这里不会涉及到细节问题,关于spring security和OAuth2,JWT有很多很多的内容。特别是想要用好spring security,读它的源码是必不可少的。这里提供一个在学习过程中的一些笔记,记得比较混乱。
另外说一下笔记中没有但是很重要也很基础的内容,spring security是通过filter链实现鉴权的。验证码的校验通过对比redis中的值进行验证,验证逻辑需要扩展一个filter并且放在UsernamePasswordAuthenticationFilter之前。短信验证码由于提供的是手机号,因此需要通过UserDetailsService去判断手机号是否存在,因此需要提供一个AuthenticationProvider调用UserDetailsService来做验证。验证的手机信息需要通过一个filter封装,该filter应该放在UsernamePasswordAuthenticationFilter之后,保证最后的Authentication类的对象是以手机号的检验为准。
其实spring security本身提供了一个sso功能,也是使用OAuth2,也可以用JWT,但是有一点很尴尬,它不能在微服务中实现自己的资源服务器。我在微服务中提供自己的资源服务器后,就拿不到token了。如果没有自己的资源服务器,前后端分离后使用认证服务器中的token是不起作用的。这样的话对于浏览器,前后端没有分离的应用是可以的。但是对于app和前后端分离的应用就麻烦了。所以这里就来说一说怎么去做适用于app,前后端分离的OAuth2+JWT的单点登录。
最后还有一个问题,如果用feign进行微服务之间的调用,请求头中的token会丢失。这个需要通过读feign的源码,进行相应的扩展,在调用httpClient之前将header中的信息加入被调用的微服务http请求中。