spring security OAuth开发APP认证框架

服务提供商搭建

在这里插入图片描述

认证服务器

添加配置文件,引入@Configuration @EnableAuthorizationServer注解,即可搭建认证服务器

1、授权模式
(1)授权码模式
① /oauth/authorize 获取授权码,让用户跳过做授权的路径,需要带参数(参考OAuth2官网),作为服务提供商,需要知道三件事

  • 哪个应用请求授权,通过client_id识别(可通过yml/properties配置)
security:
  oauth2:
    client:
      client-id: api
      client-secret: apiSecret
  • 请求的是哪个用户,需要输入账号密码
  • 请求什么样的权限,通过scope参数带过来(scope参数是服务提供自定义的字符串)

PS:请求路径 http://xxx/oauth/authorize?response_type=code&client_id=api&redirect_uri=http://example.com&scope=all,报403 Forbidden,需要加入ROLE_USER角色

② /oauth/token 用户根据授权码换取token令牌路径

  • 发送POST请求,头部带上Basic Auth,参数如下
grant_type:authorization_code
client_id:api
code:67r411
redirect_uri:http://example.com
scope:all

(2)密码模式:无需获取授权码,直接使用账号密码获取令牌,请求路径 /oauth/token,头部带上Basic Auth,参数如下

grant_type:password
username:uca46589
password:123456
scope:all

资源服务器

添加配置文件 引入@Configuration @EnableResourceServer注解,即可搭建资源服务器

spring security OAuth 核心源码

在这里插入图片描述
1、解析
(1)TokenEndpoint,类似于controller,用于处理 /oauth/token 请求,根据grant_type类型调用不同的授权模式进行验证
(2)ClientDetailsService,获取第三方信息,存储到ClientDetails,如clientId、clientSecret等
(3)TokenRequest,用于存储用户传入参数,grant_type、scope等
(4)TokenGranter(封装了四种授权模式,包括刷新令牌模式),Token生成接口类,根据请求传入的grant_type挑选实现类,将会产生OAuth2Request(clientDetails、tokenRequest信息整合)和Authentication(当前用户权限信息,通过UserDetailsService读取出来),组合起来,将会产生OAuth2Authentication
(5)AuthorizationServerTokenServices,认真服务器令牌服务,生成OAuth2令牌,其中TokenStore用于令牌存取,TokenEnhancer令牌增强器(用于令牌新增字段)

重构登录方式(自定义认证)

在这里插入图片描述
1、更改登录成功处理器
(1)从请求头中获取Authorization参数,并截取出clientId、clientSecret
(2)通过clientDetailService,传入clientId获取clientDetails,以此验证请求头中的clientId、clientSecret是否授权配置
(3)验证成功后,根据clientId、clientDetails中的scope创建tokenRequest
(4)tokenRequest结合clientDetails创建oAuth2Request
(5)根据创建的oAuth2Request、成功处理器已有的authentication创建oAuth2Authentication
(6)将oAuth2Authentication传入authorizationServerTokenServices构建oAuth2AccessToken,并返回给前端

2、验证码存储逻辑重构
在这里插入图片描述
浏览器端存储验证码到服务器的session中,但APP等前端技术不支持cookie,故session无法使用,将存储转移至redis缓存中进行存储,但需要结合前端传入的deviceId设备参数(唯一标识)

重构社交模块

1、简化模式:导向认证服务器,可以直接获取openId和accessToken,但此时还不能访问我们自己的资源服务,需要用openId换取token令牌

在这里插入图片描述

2、标准授权码模式
在这里插入图片描述
(1)测试情况无法模拟app,故先采用浏览器模式,拿到授权码,再模拟第四步骤以后的操作流程
(2)浏览器会调用OAuth2AuthenticationService 类 中的getAuthToken()方法判断是否有授权码来进行下一步操作,在此方法打断点,获取授权码
(3)拿到授权码后,模拟第四部,返回302,因为社交模块使用的是spring默认的处理器,会跳转到成功页面,故无法模拟4步骤后的流程,因此无法获取令牌,就会报错
(4)APP模块需要自定义社交模块的成功失败处理器

重构注册逻辑

1、新增注册页面工具类,用于将session里的用户信息缓存到redis中;并提供注册功能,将信息插入到数据库
2、新建配置类SpringSocialConfigurerPostProcessor实现BeanPostProcessor,作用是bean初始化之前、之后都会经过两个方法,改写初始化之后的方法,将浏览器调转到注册页的url改为APP的url
3、当App登录,由于未注册,将跳转到App自定义的url请求,获取401状态码及用户信息,APP接受后引导用户到注册页面进行注册
4、注册发送请求为/frontend/p/regist
PS:注册逻辑都需要带上deviceId

Token 处理(令牌配置)

1、基本token参数配置
(1)认证服务器配置文件修改,继承AuthorizationServerConfigurerAdapter

  • 配置入口(切入点),需要指定TokenEndpoints切入点的AuthorizationManager,UserDetailsService;
  • 配置与客户端相关的信息,允许自定义客户端、token过期时间、授权模式

2、令牌存储配置到持久化数据源:
(1)redis持久化数据源配置:TokenConifg
(2)在配置切入点加入tokenStore设置

3、使用JWT(JSON Web Token)替换默认Token:
(1)默认令牌不包含任何信息,若数据库挂掉了,令牌也将无用处,因为拿不到任务的用户信息;而JWT是自包含,可以保护用户信息,这样无需去数据库读取信息;且JWT有密钥签名,可扩展,即允许自定义
(2)在TokenConfig中进行相关配置

4、令牌增强配置:TokenConfig中进行相关配置,DefaultTokenServices中的createAccessToken中支持token增强配置,只有accessTokenEnhancer不为空情况才生效

5、扩展和解析JWT的信息:引入jwttwebtoken工具,后去request中的Authorization,设置解密密钥(JWT密签),并通过此工具进行解析,即可拿到JWT自定义配置的信息

6、token刷新机制:若前端检测到token过期,则发送刷新token请求,获取新的token,提升用户体验,无需重复登录,若refreshToken已失效,则需要用户再次登录

JWT实现SSO单点登录

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值