/bandhu-parent/bandhu-core/src/main/java/org/bandhu/core/rest/oauth/OAuthService.java

https://github.com/jasphior/bandhu · Java · 305 lines · 253 code · 48 blank · 4 comment · 28 complexity · 7bd263696fcf02859dfd8f3f21866c78 MD5 · raw file

  1. package org.bandhu.core.rest.oauth;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import org.bandhu.core.rest.BandhuRESTService;
  5. import org.bandhu.core.rest.sp.RESTServiceProvider;
  6. import org.bandhu.core.rest.sp.RESTServiceProviderService;
  7. import org.bandhu.core.rest.sp.SimpleSPService;
  8. import org.bandhu.util.BandhuException;
  9. import org.bandhu.util.BandhuUtil;
  10. import com.sun.jersey.api.client.Client;
  11. import com.sun.jersey.api.client.ClientResponse;
  12. import com.sun.jersey.api.client.WebResource;
  13. import com.sun.jersey.oauth.client.OAuthClientFilter;
  14. import com.sun.jersey.oauth.signature.HMAC_SHA1;
  15. import com.sun.jersey.oauth.signature.OAuthParameters;
  16. import com.sun.jersey.oauth.signature.OAuthSecrets;
  17. import com.sun.jersey.oauth.signature.OAuthSignature;
  18. import com.sun.jersey.oauth.signature.OAuthSignatureException;
  19. public class OAuthService extends BandhuRESTService {
  20. private String scope;
  21. private OAuthToken token;
  22. private OAuthToken accessToken;
  23. private RESTServiceProvider serviceProvider;
  24. private Map<String, String> serviceParameters = new HashMap<String, String>();
  25. public OAuthService(OAuthConsumer oAuthConsumer,
  26. Class<? extends RESTServiceProvider> serviceProviderClazz)
  27. throws BandhuException {
  28. super(String.valueOf(System.currentTimeMillis()), oAuthConsumer);
  29. this.serviceProvider = BandhuUtil.createInstance(serviceProviderClazz);
  30. init();
  31. }
  32. protected OAuthService(OAuthConsumer oAuthConsumer) throws BandhuException {
  33. super(oAuthConsumer);
  34. serviceProvider = (RESTServiceProvider) this;
  35. init();
  36. }
  37. private void init() {
  38. this.serviceParameters.put(OAuthConstants.CLIENT_API_ID,
  39. getOAuthConsumer().getClientId());
  40. this.serviceParameters.put(OAuthConstants.CLIENT_API_KEY,
  41. getOAuthConsumer().getKey());
  42. this.serviceParameters.put(OAuthConstants.CONSUMER_SECRET,
  43. getOAuthConsumer().getSecret());
  44. }
  45. public OAuthService setScope(String scope) {
  46. this.scope = scope;
  47. return this;
  48. }
  49. public String getScope() {
  50. return scope;
  51. }
  52. public OAuthRequest createRequest(String url, String appendToURL,
  53. String... urlTokenData) {
  54. return new OAuthRequest(this, new SimpleSPService(url), appendToURL,
  55. urlTokenData);
  56. }
  57. public OAuthRequest createRequest(RESTServiceProviderService service) {
  58. return new OAuthRequest(this, service);
  59. }
  60. public OAuthRequest createRequest(RESTServiceProviderService service,
  61. String appendToURL, String... urlTokenData) {
  62. return new OAuthRequest(this, service, appendToURL, urlTokenData);
  63. }
  64. public OAuthToken getRequestToken(String callback) throws BandhuException {
  65. RESTServiceProviderService requestEndpoint = serviceProvider
  66. .getRequestTokenEndpoint();
  67. OAuthRequest request = createRequest(requestEndpoint, null);
  68. if (BandhuUtil.hasText(callback)) {
  69. request.parameters().callback(callback);
  70. } else {
  71. request.parameters().callback(OAuthConstants.OUT_OF_BAND);
  72. }
  73. token = (OAuthToken) execute(request, Call.REQUEST_TOKEN,
  74. ClientResponse.class);
  75. serviceParameters.put(OAuthConstants.TOKEN, token.getToken());
  76. return token;
  77. }
  78. public OAuthToken getRequestToken() throws BandhuException {
  79. return getRequestToken(null);
  80. }
  81. public OAuthToken fetchAccessToken(String callback) throws BandhuException {
  82. RESTServiceProviderService requestEndpoint = serviceProvider
  83. .getAccessTokenEndpoint();
  84. OAuthRequest request = createRequest(requestEndpoint, null);
  85. if (BandhuUtil.hasText(callback)) {
  86. request.parameters().callback(callback);
  87. }
  88. accessToken = (OAuthToken) execute(request, Call.ACCESS_TOKEN,
  89. ClientResponse.class);
  90. connected = true;
  91. serviceParameters.put(OAuthConstants.ACCESS_TOKEN,
  92. accessToken.getToken());
  93. return accessToken;
  94. }
  95. public OAuthToken fetchAccessToken() throws BandhuException {
  96. return fetchAccessToken(null);
  97. }
  98. public OAuthToken getAccessToken() throws BandhuException {
  99. return accessToken;
  100. }
  101. public String getAuthenticationURL(String callback) throws BandhuException {
  102. if (token == null) {
  103. token = getRequestToken(callback);
  104. }
  105. return getCallableAuthUrl();
  106. }
  107. public String getAuthenticationURL() throws BandhuException {
  108. if (token == null) {
  109. token = getRequestToken();
  110. }
  111. return getCallableAuthUrl();
  112. }
  113. private String getCallableAuthUrl() {
  114. String url = null;
  115. String oauth_token = "";
  116. if (token != null) {
  117. url = token.getAuthUrl() != null ? token.getAuthUrl()
  118. : serviceProvider.getAuthorizeTokenEndpoint().getURL();
  119. oauth_token = token.getToken();
  120. } else {
  121. url = serviceProvider.getAuthorizeTokenEndpoint().getURL();
  122. }
  123. url = BandhuUtil.replaceTokens(url, serviceParameters);
  124. if (BandhuUtil.hasText(url)) {
  125. if (url.contains(OAuthConstants.TOKEN)) {
  126. return url;
  127. } else {
  128. return url + ((url.contains("?")) ? "&" : "?")
  129. + OAuthConstants.TOKEN + "=" + oauth_token;
  130. }
  131. } else {
  132. return null;
  133. }
  134. }
  135. private <T> Object execute(OAuthRequest oAuthRequest, Call call, Class<T> t)
  136. throws BandhuException {
  137. OAuthParameters params = oAuthRequest.parameters()
  138. .signatureMethod(HMAC_SHA1.NAME).timestamp().nonce().version();
  139. params.consumerKey(getOAuthConsumer().getKey());
  140. OAuthSecrets secrets = oAuthRequest.secrets();
  141. secrets.consumerSecret(getOAuthConsumer().getSecret());
  142. // establish the secrets that will be used to sign the request
  143. String endpoint = null;
  144. switch (call) {
  145. case REQUEST_TOKEN:
  146. if (BandhuUtil.hasText(scope)) {
  147. params.put("scope", scope);
  148. oAuthRequest.addHeaderValue("scope",
  149. BandhuUtil.encodeURL(scope));
  150. }
  151. endpoint = oAuthRequest.getServiceProvider()
  152. .getRequestTokenEndpoint().getURL();
  153. break;
  154. case ACCESS_TOKEN:
  155. endpoint = oAuthRequest.getServiceProvider()
  156. .getAccessTokenEndpoint().getURL();
  157. params.token(token.getToken()).verifier(token.getVerifier());
  158. secrets.tokenSecret(token.getTokenSecret());
  159. String realm = token.getRealm();
  160. if (realm != null)
  161. params.realm(realm);
  162. break;
  163. case PROCESS:
  164. endpoint = oAuthRequest.getServiceProviderService().getURL();
  165. params.token(accessToken.getToken());
  166. secrets.tokenSecret(accessToken.getTokenSecret());
  167. break;
  168. }
  169. if (!BandhuUtil.hasText(endpoint)) {
  170. throw new BandhuException("No endpoint specified!!");
  171. }
  172. oAuthRequest.prepare(serviceParameters);
  173. System.out.println("Endpoint resolved to -> "
  174. + oAuthRequest.getEndpoint());
  175. // generate the digital signature and set in the request
  176. try {
  177. OAuthSignature.sign(oAuthRequest, params, secrets);
  178. } catch (OAuthSignatureException e) {
  179. throw new BandhuException(e.getMessage());
  180. }
  181. Client client = oAuthRequest.getClient();
  182. client.setFollowRedirects(true);
  183. OAuthClientFilter filter = new OAuthClientFilter(client.getProviders(),
  184. params, secrets);
  185. // OAuth test server resource
  186. WebResource resource = oAuthRequest.buildWebResource();
  187. resource.addFilter(filter);
  188. System.out.println(oAuthRequest.getHeaderParameters());
  189. // make the request (signing it in the process)
  190. Object response = execute(resource, oAuthRequest, t);
  191. if (call == Call.REQUEST_TOKEN || call == Call.ACCESS_TOKEN) {
  192. ClientResponse clientResponse = (ClientResponse) response;
  193. String entity = clientResponse.getEntity(String.class);
  194. System.out.println("response : " + entity);
  195. System.out.println("HEAD-> " + clientResponse.getHeaders());
  196. System.out.println("PROP-> " + clientResponse.getProperties());
  197. System.out.println("STATUS-> " + clientResponse.getStatus());
  198. return OAuthToken.parse(call, entity);
  199. } else {
  200. System.out.println("response : " + response);
  201. if (response instanceof ClientResponse) {
  202. ClientResponse clientResponse = (ClientResponse) response;
  203. System.out.println("HEAD-> " + clientResponse.getHeaders());
  204. System.out.println("PROP-> " + clientResponse.getProperties());
  205. System.out.println("STATUS-> " + clientResponse.getStatus());
  206. }
  207. return response;
  208. }
  209. }
  210. public ClientResponse process(OAuthRequest oAuthRequest)
  211. throws BandhuException {
  212. ClientResponse clientResponse = (ClientResponse) process(oAuthRequest,
  213. ClientResponse.class);
  214. System.out.println("HEAD-> " + clientResponse.getHeaders());
  215. Client client = (Client) clientResponse.getProperties().get(
  216. Client.class.getName());
  217. System.out.println("PROP-> " + client.getProperties());
  218. System.out.println("STATUS-> " + clientResponse.getStatus());
  219. return clientResponse;
  220. }
  221. public <T> T process(OAuthRequest oAuthRequest, Class<T> t)
  222. throws BandhuException {
  223. if (accessToken == null) {
  224. fetchAccessToken();
  225. }
  226. return (T) execute(oAuthRequest, Call.PROCESS, t);
  227. }
  228. public OAuthConsumer getOAuthConsumer() {
  229. return (OAuthConsumer) consumer;
  230. }
  231. public OAuthToken getToken() {
  232. return token;
  233. }
  234. public void setVerifier(String verifier) {
  235. this.serviceParameters.put(OAuthConstants.VERIFIER, verifier);
  236. token.setVerifier(verifier);
  237. }
  238. public void setAccessToken(OAuthToken accessToken) {
  239. this.accessToken = accessToken;
  240. }
  241. public RESTServiceProvider getServiceProvider() {
  242. return serviceProvider;
  243. }
  244. public Map<String, String> getParameters() {
  245. return serviceParameters;
  246. }
  247. public Map<String, String> addParameter(String key, String value) {
  248. serviceParameters.put(key, value);
  249. return serviceParameters;
  250. }
  251. public void setToken(OAuthToken oAuthToken) {
  252. this.token = oAuthToken;
  253. }
  254. public enum Call {
  255. REQUEST_TOKEN, ACCESS_TOKEN, PROCESS
  256. }
  257. }