在迁移到 Spring Boot 3 之前,我们在一项服务中使用了
OAuth2RestTemplate
,效果非常好,特别是当外部服务的响应为 '401 invalid_token'
时。此实现有一个有用的功能 - OAuth2ErrorHandler
,如果在正文中收到 401 和 'invalid_token',它会自动更新令牌并使用新令牌重试请求。此外,如果响应不包含任何正文,它会分析标头中的 'www-authenticate' 并重试请求。
在 Spring Boot 3 中,
OAuth2RestTemplate
已弃用,我找不到任何等效项。我正在考虑为类似情况编写自己的重试机制实现。
处理程序中是否有具有类似机制的
OAuth2RestTemplate
的替代方案?
Spring Boot 3 使用 Spring Security 6.x 发行版本。在 Spring Security 6.3 (GA) 及更早版本中,您可以将
WebClient
与 ExchangeFilterFunction
一起用于 servlet 和 reactive 应用程序。在 Spring Security 6.4 中(目前可通过 6.4.0-M3
预发布),您还可以将 RestClient
与 OAuth2ClientHttpRequestInterceptor
一起使用。此版本将于下个月(2024 年 11 月)全面发布。
目前还没有直接替代重试机制的方法。但是,已知已过期的访问令牌将自动刷新。在这种情况下通常不需要重试逻辑。默认情况下,失败时
OAuth2AuthorizedClientManager
会自动删除无效的 OAuth2AuthorizedClient
实例(例如,刷新令牌过期、撤销等),以便下一个请求将触发重新授权。这是通过 RemoveAuthorizedClientOAuth2AuthorizationFailureHandler 完成的,您可以在参考资料中阅读有关内容。
如果需要,您可以通过 Spring Retry 添加重试支持,正如一位用户报告的那样here。重试可能仅适用于自动触发用户的重新授权流程,而不会出现 401 错误。但这可能会令人惊讶,因为返回 401 允许 UI(例如,javascript 应用程序)在重定向以进行重新授权之前向用户显示消息。如果您使用
authorization_code
以外的资助类型,您的里程可能会有所不同,但如果您觉得缺少某些内容,请随时提出问题。
总而言之,Spring Security 中新的 OAuth2 支持通常不需要旧版 OAuth 库的重试机制,因为访问令牌刷新是自动处理的。