Spring Security | Note-8

Spring Security Note-8


OAuth协议简介

OAuth协议要解决的问题
场景

如果需要开发一个第三方应用的微信数据的读取,并且对微信自拍数据的照片进行美化的处理,在此情况下,微信不会将微信的帐号和密码给第三方应用;

如果在此情况下,我们向用户提出获取数据的申请,并且在用户同意的前提下,如何向微信获取已获得授权的用户信息?

传统情况

向用户直接要取微信的用户名和密码:

1.在这样的情况下,我们可以访问用户在微信上的所有数据,不仅是照片的数据而已;

2.用户只有通过修改密码的情况,才能收回授予的授权;

3.密码的泄露的可能性大大提高;

OAuth

OAuth为了解决传统情况下的问题,不再是通过向用户收取用户名和密码的情况来获取数据;

而是通过令牌(Token)的方式,获取用户的数据;

在OAuth的情况下,只能获取对应的数据,并且有超时限制;

OAuth协议中的各种角色

Provider(服务提供商):服务提供商负责提供令牌(Token),例如:微信;

Resource Owner(资源所有者):用户的自拍数据,例如:用户;

Client(第三方应用):将微信的用户变成自己的用户,称为第三方,例如:慕课微信助手;

Authorization Server(认证服务器):认证用户身份,并且产生令牌;

Resource Server(资源服务器):存放数据,并在这里验证请求中携带的Token信息;

OAuth协议运行流程

0.用户访问第三方应用;

1.第三方应用请求用户授权;

2.同意授权的情况下,继续步骤;

3.第三方应用在获取授权的条件下,向认证服务器申请令牌,以获取用户的数据;

4.认证服务器在二次确认用户统一第三方应用的前提下,向第三方应用发放令牌;

5.第三方获得令牌后,向资源服务器申请获取资源;

6.资源服务器在确认令牌无误的情况下,向第三方应用开放数据;

OAuth协议中的授权模式

意味着在上图中的第二步,有四种方法去实现;

1.授权码模式(authorization code)

流程最严密,功能最完善

实现步骤:

0.资源所有者访问第三方应用

1.第三方应用通过引导的方式,引导用户告诉认证服务器授权给第三方应用;

2.用户同意授权;

3.在用户同意授权的情况下,认证服务器重新导回第三方的URL,同时携带一个授权码;

4.第三方应用收到授权码之后,向认证服务器申请获取令牌,(用户不可见);

5.认证服务器会认证第三方申请使用的授权码,是否为当时第三步发出的授权码;

6.在无误的情况下,向第三方应用发回令牌(Token);

2.密码模式(resource owner password credentials)
3.客户端模式(client credentials)
4.简化模式(implicit)

Spring Social基本原理

如果在获取用户数据的时候是获取的用户的基本信息,而不是数据;

将用户的数据构建成Authentication并放入SecurityContext中,那么这就相当于第三方应用拿着微信的用户基本信息进行了第三方应用的登录;

实现的基本原理完成第三方的登录;

Spring Social就是将上述的流程封装起来;

通过过滤器链中SocialAuthnticationFilter完成整个流程;

1535790603266

相关接口 & 类

在上图中的步骤1-6,是与服务提供商有关的;

服务提供商相关

ServiceProvider(AbstractOAuth2ServiceProvider):服务提供商的抽象,例如微信,QQ,微博,只需要继承抽象类并且实现即可;

Spring Social第六步中获取用户信息时不同的资源服务器用户信息时不一样,个性化的,但是第1-5步的流程是基本一致;

OAuth2Operations(OAuth2Template):整个接口,封装了步骤1-5的基本实现;

Api:(AbstractOAuth2ApiBinding):获取用户信息,帮助开发者快速完成第六步实现;

第三方相关

Connection(OAuh2Connection):封装前六步获取到的用户信息;

ConnectionFactory(OAuth2ConnctionFactory):负责创建Connection对象,在ConnectionFactory中是包含ServiceProvider的实例;

Connection是固定的实例对象,字段属性名是固定的;

ApiAdapter:用来将Api和Connection之间进行适配;

业务系统怎么和服务提供商的用户信息之间进行对应呢?

整个对应关系,是存在数据库中的,UserConnection表将业务系统User表中的User Id,和服务提供商用户之间的一个对应关系;

UsersConnectionRespository(JdbcUsersConnectionRepository):存储器,用于数据库中UserConnection做CRUD的操作;