Spring Security-13-OAuth2协议及Spring Social简介

上文中,已经实现了短信登录的方式, 常见的登录方式还有第三方登录,比如集成微信或者QQ登录, 第三方登录我们可以使用 Spring Social 去开发, 这里首先得要了解一下 OAuth2 协议

OAuth协议简介

以微信登录为例,使用微信登录后,通常我们需要去微信拿用户的信息, 最常见的方式就是微信去询问用户是否授权,然后用户同意授权之后,才能获取到微信的数据,当然这只是一个大概的流程,下面来详细看一下在这个过程中,我们的应用与微信还有用户都做了哪些事情

image

如图:

  1. 用户访问我们的应用
  2. 将用户导向第三方的认证服务器,然后获取用户的同意
  3. 用户同意之后,第三方回调我们的接口,并且传过来一个授权码
  4. 我们的应用拿到授权码之后,去第三方请求token
  5. 第三方返回token
  6. 携带token去请求第三方的资源服务器
  7. 获取到数据

这个是最常见的授权码模式 (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 ,如图:
image

这里拦截到所有的用户第三方登录的请求,然后走完第三方登录的流程

用到的一些类

首先来看一幅图
image

Spring Socail 集成第三方登录大概就是用到了这些东西, 基本分为三部分, 连接, 第三方应用还有数据库部分

ServiceProvider

ServiceProvider 就是服务提供商(比如微信,QQ)的抽象, 然后默认实现是 AbstractOAuth2ServiceProvider ,里面有两个属性 OAuth2OperationsAPI

OAuth2Operations 就封装了标准的oauth2协议流程,就算是最从用户访问我们的应用到去认证服务器中请求数据(上面图中的 1-8 步) ,他的默认实现是 OAuth2Template

然后是 API, 这是一个抽象的方法需要我们自己去实现,因为每个提供商返回的数据都不一样,所以针对不同的提供商要做不同的实现,他也提供了一个默认的实现是 AbstractOAuth2ApiBinding

总之就是封装了一些跟服务提供商相关的行为

Connection

Connection是用来封装上面获取到的用户信息的, 通过 ConnectionFactory 创建, 获取用户信息肯定需要跟服务提供商交互,所以 ConnectionFactory 中包含了 ServiceProvider

Connection 的默认实现是 OAuth2Connection ,它的数据结构是固定的,但是每个服务提供方返回来的数据都不一样,所以这里需要 ApiAdapter 去做适配

UsersConnectionRepository

最后一部分就是数据库的部分, 我们通过前面几步获取到了第三放的用户信息之后, 需要与我们的业务系统中的用户做关联

所以需要一个业务系统的用户与第三方用户对应的表, 这里就要用到 UsersConnectionRepository 去操作数据库了, 具体的实现是 JdbcUsersConnectionRepository

开发第三方登录流程

从上图中可以看到, 要实现一个第三方登录就需要一个 Connection ,这个要通过 ConnectionFactory 去构建, ConnectionFactory 中又需要 ServiceProviderApiAdapter

所以先从 ServiceProvider 开始,先实现 API 部分, 然后 OAuth2Operations 用它默认的实现, 然后再是 ApiAdapter

有了这两个之后就能构建 ConnectionFactory 了, 然后创建 Connection 最后通过 UsersConnectionRepository 操作数据库做关联

总结

  1. 了解OAuth协议的一个流程
  2. 了解 Spring Social 的用法