我不得不使用一个外部API,它使用OAuth2来保证安全性。它们不支持授权类型“client_credentials”,而是给予了一个长寿命的refresh_token,我们可以将其注入Spring应用程序,而不会使其过期。
但是,我找不到任何有关如何使用给定的refresh_token为WebClient设置OAuth2过滤器以获取access_token的信息。
下面是一些代码,以获得一个起点,并显示我已经尝试了什么。
第一个
有人需要做类似的事情,并有一个解决这个问题的办法吗?
我不得不使用一个外部API,它使用OAuth2来保证安全性。它们不支持授权类型“client_credentials”,而是给予了一个长寿命的refresh_token,我们可以将其注入Spring应用程序,而不会使其过期。
但是,我找不到任何有关如何使用给定的refresh_token为WebClient设置OAuth2过滤器以获取access_token的信息。
下面是一些代码,以获得一个起点,并显示我已经尝试了什么。
第一个
有人需要做类似的事情,并有一个解决这个问题的办法吗?
1条答案
按热度按时间q5iwbnjs1#
是的,我做过类似的事情。我的上下文是(尝试)与Google Smart Device Management生态系统集成。我不确定我是否推荐它,但我至少成功地使用了刷新令牌来连接到API。
我可以想到两种方法来实现这一点:
1.自己实现
ReactiveOAuth2AuthorizedClientService
类1.使用内存中实现并在启动时加载
refreshToken
这两种方法是相似的,因为在这两种情况下,我们都没有
accessToken
,必须给予框架一个过期的令牌,这样它就知道在第一次使用时加载一个新的令牌。我选择了第二种选择,尽管事后看来,第一种选择可能更好。
下面是一个类,它将所有概念联系在一起,并允许您为基于请求的访问或不响应用户请求的后台服务(例如,计划的批处理作业)创建一个
WebClient
:**注意:**为了简单起见,我重新使用了
spring-security-oauth2-resource-server
中的BearerTokenAuthenticationToken
,因为需要某种主体来唯一标识刷新令牌。Sping Boot 将为您提供大多数注入的bean(默认为内存中),但您需要提供
ReactiveOAuth2AuthorizedClientProvider
:如果在后台服务中使用
WebClient
,您需要通过ReactiveSecurityContextHolder
自己设置与principal
相同的BearerTokenAuthenticationToken
。请参阅文档以了解更多信息。