我想增强 OAuth2 提供商的令牌请求。我需要向 POST 请求添加一个附加参数。我不明白在哪里连接到 Spring Boot 框架来完成此任务。
Spring Boot 框架提供了一个用于自定义 OAuth2RestTemplate 的钩子,如“自定义用户信息 RestTemplate https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-security.html#boot-features-security-custom-user-info“。我已经实现了以下定制器,它会按预期进行实例化和调用。不幸的是,当发出令牌请求时,我的提供程序似乎没有被调用。
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,或者更好的是,获取对默认 AccessTokeProvder 的引用并使用拦截器或增强器挂钩到请求?
代码示例
在下面的 fork 中,请参阅 /simple 模块。将 AAD 租户信息添加到 /simple/src/main/resources/application.yml 文件中:
https://github.com/bmillerbma/tut-spring-boot-oauth2/tree/aad https://github.com/bmillerbma/tut-spring-boot-oauth2/tree/aad
NOTES:
这次提交 https://github.com/spring-projects/spring-security-oauth/commit/df0d04dc4617cc7961b260b21626b2c5f6b20056框架似乎使这成为可能,但如何利用这一功能呢?
这个问题 https://stackoverflow.com/questions/24424715/requestenhancer-not-used-for-authorizationcodeaccesstokenprovider-during-getredi似乎是相关的。不知何故,这家伙添加了一个自定义提供程序。但是哪里?
作为解决方法,我将资源添加到配置文件中,并添加以下两个类来捕获 OAuth2RestTemplate 并添加请求增强器。
应用程序.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<String, String> form, HttpHeaders headers) {
if (!StringUtils.isEmpty(resource)) {
form.set("resource", aadResource);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)