我正在尝试通过 OAuth 连接到 salesforce 生产帐户,并通过提供刷新 token 来交换访问 token 。
当我使用 Chrome Advanced Rest Client 或 CURL 调用电话时,我能够获得访问 token ;但是当我尝试使用 java HttpClient 或 URLConnection 进行相同的调用时,我得到了 400 状态。
String url = "https://login.salesforce.com/services/oauth2/token";
String requestBody = "grant_type=refresh_token&client_id=myClientId&client_secret=myClientSecret&refresh_token=myRefreshToken";
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
//add reuqest header
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", "myapp/1.0");
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
// Send post request
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(requestBody);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + requestBody);
System.out.println("Response Code : " + responseCode);
BufferedReader br = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
br.close();
//print result
System.out.println(response.toString());
我使用 wireshark 检查了这两个请求。这两个请求看起来完全相同。由于 URL 是 https,我将请求发布到一个虚拟 URL 并使用 wireshark 进行了验证。
有人遇到过这种问题吗?顺便说一句,相同的代码适用于开发版,不适用于生产版。对于生产版,它适用于 CURL 和 Chrome ARC。
最佳答案
Salesforce 仅允许 TLS 1.1 或更高版本的 HTTPS 连接。由于我在 Java 7 上运行,默认为 TLS 1.0。结果,来自 Java 的请求失败。
通过添加以下属性,我们可以添加对 TLSv1.1 和 TLSv1.2 的支持
-Dhttps.protocols=TLSv1.1,TLSv1.2
关于Java HTTPS (SSL) 连接返回 400 状态,其中 CURL/ARC 适用于相同的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41197575/