述
上文中,已经实现了短信登录的方式, 常见的登录方式还有第三方登录,比如集成微信或者QQ登录, 第三方登录我们可以使用 Spring Social
去开发, 这里首先得要了解一下 OAuth2
协议
OAuth协议简介
以微信登录为例,使用微信登录后,通常我们需要去微信拿用户的信息, 最常见的方式就是微信去询问用户是否授权,然后用户同意授权之后,才能获取到微信的数据,当然这只是一个大概的流程,下面来详细看一下在这个过程中,我们的应用与微信还有用户都做了哪些事情
如图:
- 用户访问我们的应用
- 将用户导向第三方的认证服务器,然后获取用户的同意
- 用户同意之后,第三方回调我们的接口,并且传过来一个授权码
- 我们的应用拿到授权码之后,去第三方请求token
- 第三方返回token
- 携带token去请求第三方的资源服务器
- 获取到数据
这个是最常见的授权码模式 (Authorization code) ,OAuth提供了4中授权方式:
- 授权码模式 Authorization code
- 简化模式 implicit
- 密码模式 resource owner Password credentials
- 客户端模式 client credentials
名词定义
- Client: 客户端,即我们自己的应用
- Provider: 服务提供商,即微信或者QQ等等
- Resource Owner: 资源所有者,即用户
- Authorization Server: 认证服务器
- Resource Server: 资源服务器
Spring Social
上面的例子中,最后一步就可以拿到第三方的用户信息,在Spring Security中,用户认证成功就是将一个已认证的 Authentication
对象放到 SecurityContext
中
Socail 其实和我们之前的用户名密码登录,或者短信登录是一样的,只不过是一种不同的登录方式,在 Spring Socail
会在 Spring Security 的过滤器链中加一个过滤器 SocialAuthenticationFilter
,如图:
这里拦截到所有的用户第三方登录的请求,然后走完第三方登录的流程
用到的一些类
首先来看一幅图
Spring Socail 集成第三方登录大概就是用到了这些东西, 基本分为三部分, 连接, 第三方应用还有数据库部分
ServiceProvider
ServiceProvider
就是服务提供商(比如微信,QQ)的抽象, 然后默认实现是 AbstractOAuth2ServiceProvider
,里面有两个属性 OAuth2Operations
和 API
OAuth2Operations
就封装了标准的oauth2协议流程,就算是最从用户访问我们的应用到去认证服务器中请求数据(上面图中的 1-8 步) ,他的默认实现是 OAuth2Template
然后是 API
, 这是一个抽象的方法需要我们自己去实现,因为每个提供商返回的数据都不一样,所以针对不同的提供商要做不同的实现,他也提供了一个默认的实现是 AbstractOAuth2ApiBinding
总之就是封装了一些跟服务提供商相关的行为
Connection
Connection
是用来封装上面获取到的用户信息的, 通过 ConnectionFactory
创建, 获取用户信息肯定需要跟服务提供商交互,所以 ConnectionFactory
中包含了 ServiceProvider
Connection
的默认实现是 OAuth2Connection
,它的数据结构是固定的,但是每个服务提供方返回来的数据都不一样,所以这里需要 ApiAdapter
去做适配
UsersConnectionRepository
最后一部分就是数据库的部分, 我们通过前面几步获取到了第三放的用户信息之后, 需要与我们的业务系统中的用户做关联
所以需要一个业务系统的用户与第三方用户对应的表, 这里就要用到 UsersConnectionRepository
去操作数据库了, 具体的实现是 JdbcUsersConnectionRepository
开发第三方登录流程
从上图中可以看到, 要实现一个第三方登录就需要一个 Connection
,这个要通过 ConnectionFactory
去构建, ConnectionFactory
中又需要 ServiceProvider
和 ApiAdapter
所以先从 ServiceProvider
开始,先实现 API 部分, 然后 OAuth2Operations
用它默认的实现, 然后再是 ApiAdapter
有了这两个之后就能构建 ConnectionFactory
了, 然后创建 Connection
最后通过 UsersConnectionRepository
操作数据库做关联
总结
- 了解OAuth协议的一个流程
- 了解 Spring Social 的用法