Spring OAuth2 Client中调用reauthorizeRequest的原因解析
这段代码的设计核心是确保最终拿到的是当前有效的OAuth2访问令牌,我们拆解下逻辑:
第一步:获取初始授权客户端
代码首先尝试从请求属性中读取已缓存的OAuth2AuthorizedClient,如果没有缓存(比如首次请求),就通过authorizeRequest发起首次授权流程,获取初始的访问令牌。这一步解决的是「无可用令牌」的场景。
第二步:校验并刷新过期令牌
拿到授权客户端后,调用reauthorizeRequest的关键作用是检查当前令牌的有效性:
- 如果令牌未过期且状态正常,
reauthorizeRequest会返回空Mono,授权管理器直接返回原授权客户端,不会触发额外操作 - 如果令牌已过期(或配置的提前刷新条件触发),
reauthorizeRequest会构建一个需要重新授权的请求,触发授权管理器的刷新令牌流程,获取新的有效访问令牌
这种设计是Spring Security OAuth2客户端的防御性处理:首次授权只是拿到了令牌,但令牌有有效期,后续请求时必须确保使用的是未过期的有效令牌,避免因令牌失效导致请求失败。不管是缓存的旧令牌还是刚获取的新令牌,都要经过这一步校验,保证最终返回的授权客户端是可用的。
附原代码片段:
private Mono<OAuth2AuthorizedClient> authorizedClient(ClientRequest request) { OAuth2AuthorizedClient authorizedClientFromAttrs = oauth2AuthorizedClient(request); // @formatter:off return Mono.justOrEmpty(authorizedClientFromAttrs) .switchIfEmpty(Mono.defer(() -> authorizeRequest(request) .flatMap(this.authorizedClientManager::authorize)) ) .flatMap((authorizedClient) -> reauthorizeRequest(request, authorizedClient) .flatMap(this.authorizedClientManager::authorize) ); // @formatter:on }
内容的提问来源于stack exchange,提问作者Jaydeep Patel
相关产品推荐
相关产品推荐

