OAuth2RestTemplate для Salesforce выдает ошибку - HTTP 400 Bad Request
Я пытаюсь интегрировать Spring Boot с Salesforce, используя OAuth2RestTemplate
но это дает мне Access token denied
ошибка, хотя учетные данные верны. После отладки я обнаружил, что Salesforce отправляет 400 HTTP-код состояния.
package com.sentryds.advis.salesforce;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordResourceDetails;
import org.springframework.security.oauth2.common.AuthenticationScheme;
@SpringBootApplication
public class SalesforceApplication {
public static void main(String[] args) {
SpringApplication.run(SalesforceApplication.class, args);
ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails();
resourceDetails.setAuthenticationScheme(AuthenticationScheme.form);
resourceDetails.setAccessTokenUri("https://test.salesforce.com/services/oauth2/token");
resourceDetails.setGrantType("password");
resourceDetails.setClientId("xxxxxxxx");
resourceDetails.setClientSecret("xxxxxxxx");
resourceDetails.setUsername("xxxxxxxx");
resourceDetails.setPassword("xxxxxxxx");
OAuth2RestTemplate auth2RestTemplate = new OAuth2RestTemplate(resourceDetails);
try {
System.out.println(auth2RestTemplate.getAccessToken());
} catch (Throwable t) {
System.out.println(t.getMessage());
}
}
}
Однако, если я следую этой методике, тогда все работает. Единственная причина, я использую OAuth2RestTemplate
потому что он автоматически обновляет токен. Если есть другой способ сделать это без использования OAuthRestTemplate, пожалуйста, дайте мне знать об этом.
1 ответ
Решение
Наконец я смог решить эту проблему. Я публикую свой ответ с надеждой, что он кому-нибудь поможет.
ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();
resource.setAccessTokenUri("https://test.salesforce.com/services/oauth2/token");
resource.setClientId("client_id");
resource.setClientSecret("client_secret");
resource.setClientAuthenticationScheme(AuthenticationScheme.form);
resource.setUsername("username");
resource.setPassword("password");
OAuth2RestTemplate operations = new OAuth2RestTemplate(resource(), new DefaultOAuth2ClientContext(new DefaultAccessTokenRequest()));
operations.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); // Not required if you are not doing any conversion
operations.getMessageConverters().add(new StringHttpMessageConverter()); // Not required if you are not doing any conversion
try {
System.out.println(auth2RestTemplate.getAccessToken());
} catch (Throwable t) {
System.out.println(t.getMessage());
}