【发布时间】:2021-01-28 19:18:05
【问题描述】:
我有一个 Spring Boot 应用程序,它成功地从 Azure 身份验证端点获取访问令牌。但是当我尝试使用相同的令牌访问 Dynamics CRM Online REST API 时,我得到 - 401 Unauthorized: [no body]
这就是我获取访问令牌的方式
@Bean(name = "oAuth2RestTemplate")
public OAuth2RestTemplate oAuth2RestTemplate() {
String tokenUri = "https://login.windows.net/<tenant id>/oauth2/token";
ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();
resourceDetails.setId("1");
resourceDetails.setAccessTokenUri(tokenUri);
resourceDetails.setClientId(clientid);
resourceDetails.setClientSecret(clientsecret);
resourceDetails.setGrantType("client_credentials");
resourceDetails.setScope(Arrays.asList("read", "write"));
AccessTokenRequest atr = new DefaultAccessTokenRequest();
atr.add("resource", "https://my.api.crm9.dynamics.com");
OAuth2ClientContext clientContext = new DefaultOAuth2ClientContext(atr);
OAuth2RestTemplate oauth2RestTemplate = new OAuth2RestTemplate(resourceDetails, clientContext);
return oauth2RestTemplate;
}
这是我使用此 OAuth2RestTemplate 作为我的访问令牌得到的 -
{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImtnMkxZczJUMENUaklmajRydDZKSXluZW4zOCIsImtpZCI6ImtnMkxZczJUMENUaklmajRydDZKSXluZW4zOCJ9.eyJhdWQiOiIwMDAwMDAwMi0wMDAwLTAwMDAtYzAwMC0wMDAwMDAwMDAwMDAiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC82MDQwOTE1Yi05ZGZmLTRkNDctYmIzNS04YWM5YzlhNWRjMTgvIiwiaWF0IjoxNjAyNjcxNzYyLCJuYmYiOjE2MDI2NzE3NjIsImV4cCI6MTYwMjY3NTY2MiwiYWlvIjoiRTJSZ1lQRGlWbHRZZlYxNHc5TTMxMmFmQ3BUWEFnQT0iLCJhcHBpZCI6IjM2NDlmNTUxLTRlMjEtNDY3OS04YThjLTA4ZDhmNmIwOTA3MSIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzYwNDA5MTViLTlkZmYtNGQ0Ny1iYjM1LThhYzljOWE1ZGMxOC8iLCJvaWQiOiJiM2FmOTcxYi1lMDQ5LTQ1ZDktOTViNy1hMTg3ZjQ4MWQzNWYiLCJyaCI6IjAuQVMwQVc1RkFZUC1kUjAyN05Zckp5YVhjR0ZIMVNUWWhUbmxHaW93STJQYXdrSEV0QUFBLiIsInN1YiI6ImIzYWY5NzFiLWUwNDktNDVkOS05NWI3LWExODdmNDgxZDM1ZiIsInRlbmFudF9yZWdpb25fc2NvcGUiOiJOQSIsInRpZCI6IjYwNDA5MTViLTlkZmYtNGQ0Ny1","token_type":"Bearer","expires_in":3528,"ext_expires_in":"3599","expires_on":"1602675662","not_before":"1602671762","resource":"**00000002-0000-0000-c000-000000000000**"}
如您所见,访问令牌中的资源与我想要的资源端点不同 - https://my.api.crm9.dynamics.com
我正在尝试以这种方式访问我的休息服务 -
public List<Contact> findContacts() throws MalformedURLException, IOException {
System.out.println("getting access token");
final UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(
"https://my.api.crm9.dynamics.com").path("/api/data/v9.1/contacts?$select=_accountid,address_stateorprovince," +
"contactid,emailaddress,fullname&$filter=startswith(emailaddress,'something')");
final String url = uriComponentsBuilder.build().toUriString();
System.out.println("url is :: "+url);
try {
ResponseEntity<List<Contact>> response = oAuth2RestTemplate.exchange(url, HttpMethod.GET, createRequestEntity(),
new ParameterizedTypeReference<List<Contact>>() {});
List<Contact> contacts = null;
if (null != response) {
contacts = response.getBody();
}
return contacts;
} catch (final Exception e) {
log.error(e.getMessage());
log.error("<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
log.error("Failed to retrieve contacts from Dynamics CRM.", e);
return new ArrayList<>();
}
我看过OAuth2.0 authentication of Dynamics CRM WebAPIs from a background Java (Spring) application 在 DefaultAccessTokenRequest 中设置了资源(web api 基本 url),但这对我来说似乎没有任何影响。
我的理论是访问令牌中的资源不同导致尝试访问其余端点时出现 401。但我似乎无法明确设置资源。我的问题 -
- 我的 401 还有其他理论吗?
- 如何在我的访问令牌中明确设置我的资源?我在创建 OAuth2RestTemplate 时尝试在 DefaultAccessTokenRequest 中执行此操作
【问题讨论】:
标签: java spring azure spring-boot dynamics-crm