更新:我找到了一个更简单的方法。只需在userAuthorizationUri 后面添加一个资源参数即可。
security:
oauth2:
client:
...
userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize?resource=https://graph.windows.net
...
https://stackoverflow.com/a/45828135/2231168
原答案
在我的办公室,我们发现了一篇外国博客文章,它引导我们最终实现http://statemachine.hatenablog.com/entry/2016/04/19/155920
作为一种解决方法,您必须添加两个类来捕获 OAuth2RestTemplate 和请求增强器。它适用于包含 spring 4.2.8 的 spring boot 1.3.8,我们无法使其适用于更高版本。
application.yml:
azure:
resource: https://graph.windows.net
security:
oauth2:
client:
clientId: <<your client id>>
clientSecret: <<your client secret>>
accessTokenUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/token
userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize
clientAuthenticationScheme: form
scope: openid
resource:
userInfoUri: https://graph.windows.net/me?api-version=1.6
AzureRequestEnhancer:
@Component
public class AzureRequestEnhancer implements RequestEnhancer {
@Value("${azure.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);
}
}
}
AzureRequestEnhancerCustomizer:
@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);
}
}
PostConstruct 注解用于需要在依赖注入完成后执行任何初始化的方法。
我希望这对您的实施有所帮助。