Java 如何定制Spring Boot AccessTokenProvider?
我想增强OAuth2提供程序的令牌请求。我需要在POST请求中添加一个附加参数。我不知道在哪里可以连接到Spring引导框架来完成这一点 Spring引导框架提供了一个钩子,用于定制OAuth2RestTemplate,如“”中所述。我已经实现了下面的定制器,它按照预期被实例化和调用。不幸的是,当发出令牌请求时,我的提供者似乎没有被调用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
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文件中:
注意事项:
- 对于框架来说,这似乎是可能的,但是如何利用这一功能呢
- 似乎有关联。不知怎的,这家伙增加了一个自定义的提供者。但是在哪里呢
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
...