Security--08(Oauth协议与Spring Social)

1.Oauth协议

     1.Oauth协议要解决的问题

           Security--08(Oauth协议与Spring Social)_第1张图片

     2.Oauth协议中的各种角色

         Provider(服务提供商):服务提供商提供令牌。谁提供令牌,谁就是服务提供商。服务提供商下又包含两个角色,

                     Authaction Server(认证服务器):认证服务器就是提供令牌的

                    Recource Server(资源服务器) :资源服务器是用来存放资源和验证令牌的

         Resource Owner(资源所有者):这里的资源指的就是用户的自拍数据,资源所有者是用户,而不是微信,用户只是把自拍数据放在了微信上。

         Client(第三方应用):在这里的第三方应用指的就是lilly微信助手。

          Security--08(Oauth协议与Spring Social)_第2张图片

 

     3.Oauth协议运行流程

            0.用户访问我们的第三方应用。

            1.第三方应用请求服务请求用户给与授权。

            2.用户同意(这个是关键)

            3.第三方应用访问服务提供商,申请令牌

            4..认证服务器会验证第三方应用,如果验证通过,发放令牌

            5.第三方应用拿着令牌访问资源服务器,资源服务器会验证令牌是否合法,合法则发送数据

          第二步用户授权同意是关键,在Oauth协议中总共有四种方法来完成第二步:

          Security--08(Oauth协议与Spring Social)_第3张图片

          主流是授权码模式:(功能最严谨,流程最完善)

          Security--08(Oauth协议与Spring Social)_第4张图片

           

2.场景

    假设现在要开发一个lilly微信助手的程序,其作用是将微信上用户的自拍数据读取下来,然后进行美颜,并展示。而对于lilly微信助手来说,微信用户就是其潜在用户.

    

 

3.Spring Social原理

  

Security--08(Oauth协议与Spring Social)_第5张图片

比起Oauth协议多了两步,这里用户拿到令牌后,不在是去访问资源服务的器的用户自拍数据,而是获取用户的基本信息,封装成一个Authentication,并放入SecurityContext的时候,这就是第三方登陆spring social的原理。第一步到第五步都是一个标准的流程,而第六步第七步是一个个性化的流程。

SpringSocial做了什么呢?就是把整个流程给封装了起来,封装成了一个SocialAuthenticationFilter这样一个过滤器中,然后加入到Spring Security的过滤器链上面去。

Security--08(Oauth协议与Spring Social)_第6张图片

下面就是Spring Social对于上面流程抽象出来的接口:

Security--08(Oauth协议与Spring Social)_第7张图片

ServiceProvider:服务提供商的一个抽象。针对每一个不同的服务提供商就会有不同的实现,比如说QQ,比如说新浪,微信,都需要提供一个ServiceProvider接口的实现,Spring Social提供了有个AbstractOauth2ServiceProvider这样的一个抽象类,实现了一些共有的东西,从第六步开始就是一个个性化的流程,每个服务提供商提供的数据结构都是不一样的,针对第一步到第五步这个标准的流程,Spring Social提供了一个默认的接口叫Oauth2Operatios,这个接口有一个默认的实现叫Oauth2Template,他就封装了第一步到第五步的这个标准的流程。

针对第六步,Spring Social也提供了一个接口和抽象类去获取用户的信息,抽象类是AbstractOauth2ApiBingding。

所以整个服务提供商ServiceProvider封装了第一步到第六步的一个行为,到第七步构建用户信息就和服务提供商没有什么关系了。第七步整个都是在我们的第三方应用内部完成的。

与第七步相关的接口和类,第一个接口叫做Connection,他的作用是封装我们前六步封装完成以后获取到的用户信息,实际代码中我们用到的类是Oauth2Connection这个类,Connection是由谁创建出来的呢?是有ConnectionFactory创建出来的,实际代码中用到的类是Oauth2ConnectionFactory,这个工厂负责创建Connection实例,也就是包含了用户信息这样一个对象,为了创建这个对象一定要走前面的流程,所以他需要ServiceProvider,在Oauth2ConnectionFactory里面他是包含着一个ServiceProvider实例的,整个右边的流程是被封装起来放到Oauth2ConnectionFactory里面的,在我们的代码里面我们会去掉ServiceProvider去走前面整个六步的流程,获取到一个用户的信息,把用户的信息封装成一个Connection,这里的Connection其实是一个固定的数据结构,而我们前面说过在第六步的时候不同的服务提供商,返回的用户信息的数据结构是不一样的,如何把它转化为一个固定的Connection呢?所以需要一个ApiAdapter这样一个接口的实现来完成的,他在我们的Api和Connection之间做一个适配。

 

我们业务系统的用户数据一般会存在数据库的user表里面,服务提供商里面的用户如何与我们业务系统里面的用户关联起来呢?比如说服务提供商里面的张三登录怎么和张三在业务系统里面的A用户关联起来呢?在SpringSocial里面有一张userConnection的表,这张表里面存储了业务系统里面的userId,和服务提供商里面用户的对应关系。由谁来操作这张表呢,UsersConnectionRepository。

 

 

 

Spring Social陨落的原因:https://spring.io/blog/2018/07/03/spring-social-end-of-life-announcement

替代方案:https://spring.io/blog/2018/03/06/using-spring-security-5-to-integrate-with-oauth-2-secured-services-such-as-facebook-and-github

使用Spring Security Oauth2实现第三方登录认证:https://blog.csdn.net/SomeoneMH/article/details/88658251

 

 

    

你可能感兴趣的:(认证以及授权)