Spring Oauth2 Token处理原理

前言

相信大家在开始时经常会分不清spring security和spring oauth2的区别,对于spring security都知道是鉴权,授权服务。而oauth2的提出是为了解决第三方软件登入时的授权问题,所以oauth2可以理解为资源授权服务。例如我们在打开王者荣耀游戏时,这时候系统会提醒我们使用qq还是微信登入,这时就是王者荣耀这个第三方软件申请qq或者微信的授权来登入对应的账号。
在这里插入图片描述

上面就是Oauth2中授权中最严谨的授权码模式流程,这篇文章主要是想分享一下客户端(也就是王者荣耀)在得到token后调用对应的资源服务器(也就是qq,微信平台)时,资源服务器是如何判断token的原理。

识别

传入的是token,那qq平台上是需要根据这个token来找到对应的用户信息,这个重担应该在何时做呢?oauth给出的答案就是在请求时spring的过滤器中操作。(啥是过滤器呢?在spring mvc请求时,可以再请求达到处理方法前做加强处理,具体过滤器的适用场景可以戳这篇

过滤器

在ouath2中需要对token进行判断,所用到的类是OAuth2AuthenticationProcessingFilter。要用到这个过滤器,就要将这个过滤器加载到spring的过滤器链中,那首先的问题就是oauth2是如何将这个过滤器加载进去的呢,以及过滤器是如何生成的呢?大家可以戳一下这篇文章

看完文章后想必大家一定对过滤器有一定的了解了,Oauth2为了将OAuth2AuthenticationProcessingFilter加入到过滤器中也是一样,他创建了ResourceServerConfiguration继承自WebSecurityConfigurerAdapter,这样的话,只要程序中使用了@EnableWebSecurity注解,就可以执行到ResourceServerConfiguration的config函数
在这里插入图片描述
到这里大家可能会问,这里还是没有讲到如何将OAuth2AuthenticationProcessingFilter注册进去呀。其实这里只是将注册OAuth2AuthenticationProcessingFilter的配置类ResourceServerSecurityConfigurer添加到configs列表中,就是截图中代码的http.apply(resources)
在这里插入图片描述
ResourceServerSecurityConfigurer类的configure函数就会在上面的configure中触发
在这里插入图片描述

所以最后实际会走到ResourceServerSecurityConfigurer中的configur函数
在这里插入图片描述
看到没,这里就是插入OAuth2AuthenticationProcessingFilter的地方了。从上面我们可以学到如何新加入一个过滤器,Oauth2可能因为框架,写的比较复杂,我们工作中使用只需要写一个配置类继承自SecurityConfigurerAdapter,Spring系统会自动扫描到这个配置类,然后将过滤器加入到过滤链中。

Token处理

我们在得到一个token后,request请求会携带当前的token,在调用request的接口前首先需要判断当前token的合法性,所以如何根据一个token去判断他的有效性呢?我们来一起看下Oauth2中提供的解决方案。

在这里插入图片描述
这个函数就是OAuth2AuthenticationProcessingFilter中的doFilter函数,是请求在达到接口前一定会经过的地方。

这边的写法也透露这很好的面向对象编程,对于提取token的功能,单独提供了一个提取功能类,返回也不仅仅只是一个String类型的token,因为这个token还会附带一些相关的操作,例如校验操作,是否已经校验过的功能函数,还有token对应的用户身份信息,这些功能点聚拢,所以产生了一个包含token值的新对象Authentication

在这里插入图片描述
根据token来获取对应的信息是依靠tokenService服务实现的,目前tokenService主要有本地的默认实现和远程实现,理解起来就是本地处理token还是远程token服务来处理返回结果。而tokenService服务还需要将数据存储下来,是依靠了tokenStore服务,例如上面图中例举的这两种实现。

在这里插入图片描述
实际上tokenService处理token时先是根据这个token获取到OAuth2AccessToken对象,在根据这个对象去获取到OAuth2Authentication的结果。

对应到代码上就是:
在这里插入图片描述
进入到tokenServiceloadAuthentication函数中
在这里插入图片描述
tokenService更多的是数据的存储服务,可以放在内存中,也可以放在数据库中,当然更加通用的便是把数据放在redis上,因为在redis上非常容易实现数据的有效时间,这个对于token的有效期十分对应。

总结

上面我们一起总结了Oauth2中是如何处理请求体中传过来的token的,首先Oauth2新增加了一个过滤器,使程序在过滤期间可以将token获取到,然后根据这个token获取到对应的鉴权信息(OAuth2Authentication对象,下同),这个token和其对应的鉴权信息存储在Oauth2的TokenStore服务对象中。这个对象可以是将数据放在当前服务内存中,数据库中,redis中等等。而根据token去获取对应鉴权信息时也会有以下这几种情况

  • 根据token没有找到对应的鉴权信息,抛出Invalid access token
  • 根据token查找到对应的鉴权信息,但是这个鉴权信息过期了,抛出Access token expired
  • 根据token查找到对应的鉴权信息,但是这个鉴权信息中rescourceIds中没有包含oauth2-resource信息,抛出异常Invalid token does not contain resource id
  • 根据token查找到对应的鉴权信息,但是根据这个鉴权信息的clientId获取client信息时发生异常,则抛出Invalid token contains invalid client,同时如果请求的requst的scope不符合client中允许的scope,也会报出Invalid token contains disallowed scope for this client异常
  • 如果都没有异常,则token校验通过,可以继续下一步的filter,直到达到接口
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Cloud 中使用 OAuth 2.0 进行 Token 认证的步骤如下: 1. 引入依赖:在项目的 `pom.xml` 文件中添加相应的依赖,包括 Spring Security OAuth2、Spring Web 等。 2. 配置认证服务器:创建一个认证服务器来颁发和验证访问令牌(Access Token)。可以使用 Spring Security OAuth2 提供的 `AuthorizationServerConfigurerAdapter` 类来配置认证服务器。 3. 配置资源服务器:创建一个资源服务器来保护你的资源,只有携带有效的访问令牌才能访问。可以使用 Spring Security OAuth2 提供的 `ResourceServerConfigurerAdapter` 类来配置资源服务器。 4. 定义用户信息服务:实现 `UserDetailsService` 接口来加载用户信息,包括用户名、密码和权限等。 5. 配置安全规则:在资源服务器中配置安全规则,定义哪些请求需要进行认证和授权。 6. 客户端注册:在认证服务器中注册客户端信息,包括客户端 ID、密钥和授权类型等。 7. 获取访问令牌:客户端可以通过认证服务器的授权端点进行授权,获取访问令牌。 8. 使用访问令牌:在请求资源服务器的受保护资源时,需要将访问令牌作为身份凭证传递给资源服务器。 这只是 OAuth 2.0 认证流程的基本步骤,具体的实现会因为使用的框架和需求而有所差异。你可以参考 Spring Security OAuth2 的官方文档和示例代码来了解更多详细信息。 另外,Spring Cloud 还提供了一些高级工具和组件,如 Spring Cloud Security、Spring Cloud OAuth2 Client 等,可以进一步简化和集成 OAuth 2.0 认证流程。你可以根据具体需求选择合适的组件来使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值