EDIT I am struggling to add the correct formatting to the code post below. if someone can edit this question and apply the proper formatting to code, i would appreciate it.
I am fairly new to salesforce and as a required to our project in have to create a standalone java client for chatter. I have already developed clients for reading, writing data to salesforce custom objects using WSDL from apex classes.
Since Chatter is REST based, i am not able to integrate it. I am facing problem with generating the oAuth access tokens. When i am making calls to the https://login.salesforce.com/services/oauth2/token i am getting error message as connection refused.
Most of the tutorial i checked get access token using cUrl but i want it all to be done through a JAVA application.
I am behind a corporate firewall and have configured my proxy accordingly. Here is the code that i have developed.
package com.chatter.sf;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.xml.rpc.ServiceException;
import javax.xml.soap.SOAPException;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.simple.parser.JSONParser;
public class SfChatter {
@SuppressWarnings("unchecked")
public static void oAuthSessionProvider(String loginHost, String username,
String password, String clientId, String secret)
throws HttpException, IOException, ParseException, org.json.simple.parser.ParseException, ServiceException, SOAPException
{
JSONParser parser = new JSONParser();
// Set up an HTTP client that makes a connection to REST API.
DefaultHttpClient client = new DefaultHttpClient();
HttpParams params = client.getParams();
HttpClientParams.setCookiePolicy(params, CookiePolicy.RFC_2109);
params.setParameter(HttpConnectionParams.CONNECTION_TIMEOUT,100000);
// Set the SID.
System.out.println("Logging in as " + username + " in environment " + loginHost);
//String baseUrl = loginHost;
String baseUrl = loginHost + "/services/oauth2/token";
HttpPost oauthPost = new HttpPost(baseUrl);
// The request body must contain these 5 values.
List<BasicNameValuePair> parametersBody = new ArrayList<BasicNameValuePair>();
parametersBody.add(new BasicNameValuePair("grant_type", "password"));
parametersBody.add(new BasicNameValuePair("username", username));
parametersBody.add(new BasicNameValuePair("password", password));
parametersBody.add(new BasicNameValuePair("client_id", clientId));
parametersBody.add(new BasicNameValuePair("client_secret", secret));
oauthPost.setEntity(new UrlEncodedFormEntity(parametersBody, HTTP.UTF_8));
// Execute the request.
System.out.println("POST " + baseUrl + "...\n");
HttpResponse response=null;
try{
response= client.execute(oauthPost);
}
catch(Exception e)
{
System.out.println("Exception is= "+e.getMessage());
}
@SuppressWarnings("unused")
int code = response.getStatusLine().getStatusCode();
Map<String, String> oauthLoginResponse = (Map<String, String>)
parser.parse(EntityUtils.toString(response.getEntity()));
System.out.println("OAuth login response");
for (Map.Entry<String, String> entry : oauthLoginResponse.entrySet())
{
System.out.println(String.format(" %s = %s", entry.getKey(), entry.getValue()));
}
System.out.println("");
// Get user info.
String userIdEndpoint = oauthLoginResponse.get("id");
String accessToken = oauthLoginResponse.get("access_token");
List<BasicNameValuePair> qsList = new ArrayList<BasicNameValuePair>();
qsList.add(new BasicNameValuePair("oauth_token", accessToken));
String queryString = URLEncodedUtils.format(qsList, HTTP.UTF_8);
HttpGet userInfoRequest = new HttpGet(userIdEndpoint + "?" + queryString);
HttpResponse userInfoResponse = client.execute(userInfoRequest);
Map<String, Object> userInfo = (Map<String, Object>)
parser.parse(EntityUtils.toString(userInfoResponse.getEntity()));
System.out.println("User info response");
for (Map.Entry<String, Object> entry : userInfo.entrySet())
{
System.out.println(String.format(" %s = %s", entry.getKey(), entry.getValue()));
}
System.out.println("");
// Use the user info in interesting ways.
System.out.println("Username is " + userInfo.get("username"));
System.out.println("User's email is " + userInfo.get("email"));
Map<String, String> urls = (Map<String, String>)userInfo.get("urls");
System.out.println("REST API url is " + urls.get("rest").replace("{version}", "31.0"));
}
public static void main(String args[]) throws ParseException, HttpException, IOException, org.json.simple.parser.ParseException, ServiceException, SOAPException
{
String loginhost="https://login.salesforce.com";
String username="balaji.sozharajan@wipro.com";
String password="*****";
String client_id="3MVG9Y6d_Btp4xp5EMJiZPLQ0WUTN2aYG5RxGBlTZsB8xM97W4ehLHQKYMGTxSIAR6SGVsjLm3a.opMthTIE2";
String client_key="************";
System.getProperties().put("http.proxyHost", "proxy2.wipro.com");
System.getProperties().put("http.proxyPort", "80");
System.getProperties().put("http.proxyUser", "sh265993");
System.getProperties().put("http.proxyPassword", "*********");
oAuthSessionProvider(loginhost,username,password, client_id, client_key);
}
}
I have spent enire week finding a solution but still haven't found a way out. Any solution or suggestion would be highly appreciated.
Here is the stacktrace after executing the code given by @Mohith
Logging in as balaji.sozharajan@wipro.com in environment https://login.salesforce.com
POST https://login.salesforce.com/services/oauth2/token...
Connection refused: connect
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:524)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:403)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at com.wipro.coe.Action.TestCallout.oAuthSessionProvider(TestCallout.java:54)
at com.wipro.coe.Action.TestCallout.main(TestCallout.java:98)
Best Answer
The documentation link is below for oauth using Java client .
http://www.salesforce.com/us/developer/docs/api_streaming/Content/code_sample_auth_oauth.htm