likes
comments
collection
share

spring-authorization-server系列--authorization_code模式实现流程

作者站长头像
站长
· 阅读数 26

1、登录校验账号密码流程(/login)

        这个核心的filter就是UsernamePasswordAuthenticationFilter

spring-authorization-server系列--authorization_code模式实现流程spring-authorization-server系列--authorization_code模式实现流程

        进入UsernamePasswordAuthenticationFilter的attemptAuthentication方法,添加断点,核心就是从请求中获取到username和password,并封装成UsernamePasswordAuthenticationToken,通过this.getAuthenticationManager().authenticate(authRequest);进入下一步

spring-authorization-server系列--authorization_code模式实现流程

spring-authorization-server系列--authorization_code模式实现流程

        进入的ProviderManager的authenticate方法,遍历ProviderManager下所有的provider,如果该provider能够处理该数据,则进入该provider处理,如果处理不了则下一个provider尝试处理。判断能否处理是通过provider.supports(toTest)这个来判断的,以OAuth2AuthorizationCodeAuthenticationProvider为例,其实就是看看传入的authentication类型是不是该provider处理的类型,也就是说OAuth2AuthorizationCodeAuthenticationProvider只处理子类为OAuth2AuthorizationCodeAuthenticationToken类型的authentication

spring-authorization-server系列--authorization_code模式实现流程

      如果所有的provider都没有能够处理的,就用他们的父节点的provider处理,直至根节点。

spring-authorization-server系列--authorization_code模式实现流程

        我们这两个provider很明显是处理不了UsernamePasswordAuthenticationToken的,则进入其父节点处理parentResult = this.parent.authenticate(authentication);

spring-authorization-server系列--authorization_code模式实现流程

父节点进入authenticate,我们看看provider,居然是DaoAuthenticationProvider,我们看DaoAuthenticationProvider的父类AbstractUserDetailsAuthenticationProvider,很明显支持UsernamePasswordAuthenticationToken

spring-authorization-server系列--authorization_code模式实现流程

spring-authorization-server系列--authorization_code模式实现流程       进入DaoAuthenticationProvider的父类AbstractUserDetailsAuthenticationProvider的authenticate方法,如果缓存用户是空的,通过retrieveUser方法获取,这个方法就是DaoAuthenticationProvider实现的;然后通过additionalAuthenticationChecks校验,该方法也是DaoAuthenticationProvider实现的。

spring-authorization-server系列--authorization_code模式实现流程

spring-authorization-server系列--authorization_code模式实现流程​编辑 2、生成code流程(oauth2/authorize)

        该过程核心就是OAuth2AuthorizationEndpointFilterspring-authorization-server系列--authorization_code模式实现流程​编辑

       进入OAuth2AuthorizationEndpointFilter的doFilterInternal,核心内容就是生成Authentication

spring-authorization-server系列--authorization_code模式实现流程

            通过该Authentication authentication = this.authenticationConverter.convert(request);方法生成所需的Authentication,进入convert方法,还是遍历,遍历所有的converters,如果生成的是空进行下一个,直至把所有的converters遍历完。

spring-authorization-server系列--authorization_code模式实现流程

       这里有两个converters,先进入OAuth2AuthorizationCodeRequestAuthenticationConverter,是否该converter是否支持就是通过第一行判断的。

spring-authorization-server系列--authorization_code模式实现流程

       进入OAuth2AuthorizationCodeRequestAuthenticationConverter之后,核心功能就是封装OAuth2AuthorizationCodeRequestAuthenticationToken对象。

       然后进入OAuth2AuthorizationEndpointFilter的doFilterInternal去生成Authenticationspring-authorization-server系列--authorization_code模式实现流程

        进入authenticate方法,就是遍历provider的地方,如果该provider能够处理该数据,则进入该provider处理,如果处理不了则下一个provider尝试处理。判断能否处理是通过provider.supports(toTest)这个来判断的,这个就是上面的支不支持处理OAuth2AuthorizationCodeRequestAuthenticationToken这个对象,如果所有的provider都没有能够处理的,就用他们的父节点的provider处理,直至根节点,遍历发现OAuth2AuthorizationCodeRequestAuthenticationProvider支持

spring-authorization-server系列--authorization_code模式实现流程

进入其authenticate方法看他的源码,就是做一些客户校验,并生OAuth2AuthorizationConsentAuthenticationToken(该token不是access_token和refresh_token)

spring-authorization-server系列--authorization_code模式实现流程

        这里核心要看下this.authorizationService.save(authorization);这个方法,这里会把ID和authentication做个映射,存起来。

spring-authorization-server系列--authorization_code模式实现流程

        最后生成code

spring-authorization-server系列--authorization_code模式实现流程

3、生成token流程(oauth2/token)

spring-authorization-server系列--authorization_code模式实现流程

通过查看轨迹,核心就是OAuth2TokenEndpointFilter这个过滤器

spring-authorization-server系列--authorization_code模式实现流程

查看Authentication authorizationGrantAuthentication = this.authenticationConverter.convert(re quest);这行代码,这里有四种converter,通过判断grantType来确定用哪种converter,我们使用的是authorization_code请求的,所以这里会进入OAuth2AuthorizationCodeAuthenticationConverter

进行数据处理

spring-authorization-server系列--authorization_code模式实现流程

OAuth2AuthorizationCodeAuthenticationConverter的源码核心就是,将请求转化为OAuth2AuthorizationCodeAuthenticationToken

spring-authorization-server系列--authorization_code模式实现流程

        然后代码运行到this.authenticationManager.authenticate(authorizationGrantAuthentication);这个方法,进入之后筛选对应的provider进行数据处理

spring-authorization-server系列--authorization_code模式实现流程

           转化之后OAuth2AuthorizationCodeAuthenticationToken,会进入 OAuth2AuthorizationCodeAuthenticationProvider进一步处理

        进入OAuth2AuthorizationCodeAuthenticationProvider的authenticate方法,看this.authorizationService.findByToken这个方法,

spring-authorization-server系列--authorization_code模式实现流程

         进入findByToken方法,遍历存储的token,前面我们的ID和token的存储在initializedAuthorizations这个键值对里面,通过遍历和code对比,找到之前存储的authorization

剩下的源码就是生成access_token和refresh_token的过程

转载自:https://juejin.cn/post/7376094685495083059
评论
请登录