目录
使用Spring Social开发第三方登陆
OAuth协议简介
以前的逻辑是通过微信用户密码登陆,获取微信的用户数据,但是这种方式存在的数据泄露的危险。
由于本来该软件中本身就是只需要用户的登陆数据,但是通过密码登陆获取额外的数据。所以不安全。
所以不是将用户密码交给微信端,而是将一个令牌交过去。
OAuth运行流程
授权模式
授权码模式(web系统认证)
密码模式(app系统认证使用)
客户端模、简化模式(使用较少)
Spring Social简介
简单来说,在第六步获取到用户信息之后,根据用户信息构建Authentication并放入SecurityContext里面,SecurityContext在源码分析的时候应该已经了解了,它的作用就是讲认证成功的Authentication保存到session里面。
在spring security框架中,就是增加了一个SocialAuthenticationFilter类来拦截处理第三方请求。
具体的逻辑实现:连接第三方的类是connection,里面实现的serviceProvider中主要是两个接口OAuth2Operations(连接第三方),Api(AbstractOAuth2ApiBinding)用来适配获取的数据。在通过ApiAdapter适配对应的DB数据
开发QQ登陆
创建需要的接口
以下都是右边核心代码(ServiceProvider)
以上都是应用商需要的代码
开始编写中间的代码
现在还需要将数据保存到数据库当中,也就是最左边的数据库那块
在数据库中创建userconnection表
表的前缀添加“mxl_”,也就是说数据库那边的表前面加了该前缀就必须写没加就不设置该属性
接下来如何将上面的userid转换成用户信息呢
在之前的UserDetailsService中,用来验证用户的密码是否正确,然后就认证的数据放入到session里面
而第三方认证这里也同样的原理,提供了SocialUserDetailsService
首先解释一下loadUserByUsername()方法,处理的是表单传进来的数据
而loadUserByUserId()方法是第三方登陆的时候用的,传进来的是通过第三方传进来的userId
该方法返回的SocialUserDetails就是UserDetails的实现
创建QQProperties类
在连接类那里我们需要使用到这三个参数
只有imooc.security.social.qq.app-id配置了该配置项才会生效
在qq互联里面查看
添加social过滤器
添加到配置中
页面修改
所有的/auth请求都会被SocialAuthenticationFilter拦截
/qq中的qq就是传入的providerid的值
这个时候登陆还是有问题的