从本篇起,我们将利用SpringSocial进行第三方登录开发,它其实利用的是OAuth 2.0协议,所以有必要先了解下。
对OAuth 2.0协议还不太清楚的同学可以先看看下面这2篇文章,
https://www.cnblogs.com/Wddpct/p/8976480.html
1.OAuth 2.0协议
1.1 oauth协议要解决问题
考虑这样一个场景:假如开发一个APP-慕课微信图片美化,需要用户存储在微信上的数据;

传统的做法是:拿到用户的用户名密码
问题:
- 应用可以访问用户在微信上的所有数据;(不能做到读授权一部分功能权限)
- 只能修改密码才能收回授权
- 密码泄露可能性提高
OAuth要使用Token令牌来解决以上的问题
- 令牌绑定权限
- 令牌有过期时间
- 不需要用户的原始密码
这样对双方而言都有好处,第三方应用不用扩展客户,微信可以提高用户的黏性。
1.2 oauth协议运行流程及相关角色
相关角色:
Provider(服务提供商):在我们的例子中微信给第三方应用数据,就可以称为服务提供商
Authorization Server(认证服务器):认证用户身份,产生令牌
Resource Server(资源服务器):存放数据的。并在这里验证请求中携带的Token信息
Resource Owner(资源所有者):用户的自拍数据,所有者为用户自己
Client(第三方应用):慕课微信助手
访问流程图:

1:用户在使用第三方应用的时候,第三方应用请求用户进行微信的授权。
2:用户同意授权后,第三方应用请求微信的认证服务器,并验证用户是否同意了授权,如果认证通过,就会返回一个Token。
3:第三方应用携带Token去请求资源服务器,资源服务器根据Token找那个的信息开放相应的资源给第三方应用。
同意授权是关键,只有同意了授权才会有接下来的流程。
在第二步中有这几种授权模式:
- 授权码模式 Authorization code 流程最完整,功能最完善(最常用)
- 简化模式 implicit
- 密码模式 resource owner Password credentials
- 客户端模式 client credentials
1.3 授权码模式流程图

1:第三方请求授权时会引导用户到认证服务器,用户同意授权(注意同意授权的动作是在认证服务器上)
2:认证服务器返回一个授权码并再返回到提前定义好的第三方的一个Url上面。
3:第三方携带授权码再去认证服务器去请求Token,然后再返回一个想要的Token.
因此授权码模式是要求第三方应用要有独立的服务器的。
而简化模式不需要,在授权后直接带回令牌。
2.SpringSocial简介
2.1流程原理
SpringSocial 流程图:

上一篇讲的是第三方获取微信数据。如果在获取用户数据的时候是获取的用户的登录的一些信息的话(如图像昵称等),并将用户的数据构建成Authentication并放入SecurityContext中,那么这就相当于第三方应用拿着微信的用户信息进行了第三方应用的登录。
基于我们之前学习过的过滤链原理,在过滤器链上增加了一个 SocialAuthenticationFilter,拦截到有需要第三方登录的请求则开始引导完成所有的流程,就完成了第三方登录。

2.2 实现相关接口和类
上面的1-5步都是协议化流程,下面都是我们代码相关的接口和类

右半边:服务提供商相关实现(1-6步)
ServiceProvider(AbstractOAuth2ServiceProvider):服务提供商抽象(如微信 qq等)
OAuth2Operations(OAuth2Template):封装了1-5的步骤(标准流程)
Api(AbstractOAuth2ApiBinding):对第6步提供了支持(获取用户信息,不同服务提供商个性化实现,用户信息结构不一样)
左半边:第三方应用相关实现(第7步相关)
Connection (OAuth2Connection): 封装前6步完成获取到的用户信息
ConnectionFactory(OAuth2ConnectionFactory):创建Connection 工厂,需要下面2个支持
ServiceProvider :获取前面6步的用户信息Connection(OAuth2Connection)
ApiAdapter:OAuth2Connection是固定结构的数据,对第三方api返回的用户数据进行匹配(适配);读取用户信息
UsersConnectionRepository(JdbcUsersConnectionRepository): 业务系统用户和服务提供商用户对应关系,保存在表UserConnection
SpringSocial把第三方登录的大部分代码都实现了,我们要做的就是扩展实现上面的类或接口。
官网中页面信息提供了一些项目,可供参考。
Main Projects 官网已发布的项目,如连接Facebook的项目
Incubator Projects 孵化中的项目,也就是正在开发中的
Community Projects 社区项目,非官网提供,如微博