Java 如何定制Spring Boot AccessTokenProvider?

Java 如何定制Spring Boot AccessTokenProvider?,java,oauth-2.0,spring-boot,azure-active-directory,Java,Oauth 2.0,Spring Boot,Azure Active Directory,我想增强OAuth2提供程序的令牌请求。我需要在POST请求中添加一个附加参数。我不知道在哪里可以连接到Spring引导框架来完成这一点 Spring引导框架提供了一个钩子,用于定制OAuth2RestTemplate,如“”中所述。我已经实现了下面的定制器,它按照预期被实例化和调用。不幸的是,当发出令牌请求时,我的提供者似乎没有被调用 public class AadUserInfoRestTemplateCustomizer implements UserInfoRestTemplateCu

我想增强OAuth2提供程序的令牌请求。我需要在POST请求中添加一个附加参数。我不知道在哪里可以连接到Spring引导框架来完成这一点

Spring引导框架提供了一个钩子,用于定制OAuth2RestTemplate,如“”中所述。我已经实现了下面的定制器,它按照预期被实例化和调用。不幸的是,当发出令牌请求时,我的提供者似乎没有被调用

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();
    }
}
问题:

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

代码示例

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

注意事项:

  • 对于框架来说,这似乎是可能的,但是如何利用这一功能呢

  • 似乎有关联。不知怎的,这家伙增加了一个自定义的提供者。但是在哪里呢


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

application.yaml:

aad:
  resource: https://graph.windows.net

security:
  oauth2:
    client:
      clientId: [clientid]
etc.


@组件
公共类AzureRequestEnhancer实现RequestEnhancer{
@值(${aad.resource:null})
私有字符串源;
@凌驾
公共void增强(AccessTokenRequest请求、OAuth2ProtectedResourceDetails资源、多值映射表单、HttpHeaders){
if(!StringUtils.isEmpty(资源)){
表格集(“资源”,aadResource);
}
}
}

我遇到了同样的问题,并使用了此解决方案,但正因为如此,我坚持使用spring boot 1.3.8

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

security:
  oauth2:
    client:
      ...
      userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize?resource=https://graph.windows.net
      ...
安全性:
oauth2:
客户:
...
userAuthorizationUri:https://login.microsoftonline.com//oauth2/authorize?resource=https://graph.windows.net
...

您是否有最小的示例项目?很难理解为什么不使用上面代码段中的
AadAccessTokenProvider
。请参阅“代码示例”部分。
@Component
public class AzureRequestEnhancer implements RequestEnhancer {
    @Value("${aad.resource:null}")
    private String aadResource;

    @Override
    public void enhance(AccessTokenRequest request, OAuth2ProtectedResourceDetails resource, MultiValueMap<String, String> form, HttpHeaders headers) {
        if (!StringUtils.isEmpty(resource)) {
            form.set("resource", aadResource);
        }
    }
}
security:
  oauth2:
    client:
      ...
      userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize?resource=https://graph.windows.net
      ...