如何自定义Spring Boot AccessTokenProvider?

我想增强OAuth2提供程序的令牌请求。 我需要在POST请求中添加一个额外的参数。 我不明白在哪里挂钩Spring Boot框架来实现这一目标。

Spring Boot框架提供了一个用于自定义OAuth2RestTemplate的钩子,如“ 自定义用户信息RestTemplate ”中所述。 我已经实现了以下定制器,它被实例化并按预期调用。 不幸的是,在提出令牌请求时似乎没有调用我的提供程序。

public class AadUserInfoRestTemplateCustomizer implements UserInfoRestTemplateCustomizer { @Override public void customize(OAuth2RestTemplate oAuth2RestTemplate) { oAuth2RestTemplate.setAuthenticator(new AadOauth2RequestAuthenticator()); // Attempt 1: Use my own token provider, but it never gets called... oAuth2RestTemplate.setAccessTokenProvider(new AadAccessTokenProvider()); // Even better, if only OAuth2RestTemplate provided a getter for AccessTokenProvider, I could add interceptors and or enhancers // Can't do this :( AuthorizationCodeAccessTokenProvider provider = oAuth2RestTemplate.getAccessTokenProvider(); } } 

题:

如何设置自定义AccessTokeProvder,甚至更好,获取对默认值的引用并使用拦截器或增强器挂钩请求?

代码示例

在下面的分支中,请参阅/ simple模块。 将您的AAD租户信息添加到/simple/src/main/resources/application.yml文件中:

https://github.com/bmillerbma/tut-spring-boot-oauth2/tree/aad

笔记:

  • 对框架的这种提交似乎使这成为可能,但是如何利用这个function呢?

  • 这个问题似乎有关系。 不知怎的,这家伙增加了一个自定义提供商。 但是哪里?

我遇到了同样的问题,并使用了这种解决方法,但正因为如此,我坚持使用弹簧启动1.3.8

所以我开始深入挖掘,然后我终于找到了一种更简单的方法。 只需在userAuthorizationUri之后添加一个资源参数。

 security: oauth2: client: ... userAuthorizationUri: https://login.microsoftonline.com/<>/oauth2/authorize?resource=https://graph.windows.net ... 

作为一种解决方法,我将资源添加到我的配置文件中,并添加了以下两个类来捕获OAuth2RestTemplate并添加请求增强器。

application.yaml:

 aad: resource: https://graph.windows.net security: oauth2: client: clientId: [clientid] etc. 

 @Component public class AzureRequestEnhancerCustomizer { @Autowired private OAuth2RestTemplate userInfoRestTemplate; @Autowired private AzureRequestEnhancer azureRequestEnhancer; @PostConstruct public void testWiring() { AuthorizationCodeAccessTokenProvider authorizationCodeAccessTokenProvider = new AuthorizationCodeAccessTokenProvider(); authorizationCodeAccessTokenProvider.setTokenRequestEnhancer(azureRequestEnhancer); userInfoRestTemplate.setAccessTokenProvider(authorizationCodeAccessTokenProvider); } } 

 @Component public class AzureRequestEnhancer implements RequestEnhancer { @Value("${aad.resource:null}") private String aadResource; @Override public void enhance(AccessTokenRequest request, OAuth2ProtectedResourceDetails resource, MultiValueMap form, HttpHeaders headers) { if (!StringUtils.isEmpty(resource)) { form.set("resource", aadResource); } } } 
Interesting Posts