Salesforce 的 OAuth2RestTemplate 出现错误 - HTTP 400 错误请求

OAuth2RestTemplate for Salesforce is giving error - HTTP 400 Bad Request

我正在尝试使用 OAuth2RestTemplate 将 Spring Boot 与 Salesforce 集成,但它给我 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());
        }
    }
}

但是,如果我遵循此 technique,那么一切正常。我使用 OAuth2RestTemplate 的唯一原因是它会自动处理令牌刷新。如果有另一种不使用 OAuthRestTemplate 的方法,那么也请告诉我。

终于解决了这个问题。我发布了我的答案,希望它能对某人有所帮助。

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());
}