Advertisement
Guest User

Untitled

a guest
Jan 11th, 2012
569
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.89 KB | None | 0 0
  1. public class XOAuth {
  2.  
  3. public static void main(String[] args) throws Exception {
  4. java.io.BufferedReader input = new java.io.BufferedReader(
  5. new java.io.InputStreamReader(System.in));
  6. System.out.println("Enter an email:");
  7. String email = input.readLine();
  8. System.out.println("Enter a consumer key:");
  9. String consumerKey = input.readLine();
  10. System.out.println("Enter a consumer secret:");
  11. String consumerSecret = input.readLine();
  12. OAuthEntity requestToken = phase1("https://mail.google.com/", "oob",
  13. consumerKey, consumerSecret, email);
  14. System.out.println("To authorize token, "
  15. + "visit this url and follow the directions "
  16. + "to generate a verification code:");
  17. String verifier = input.readLine();
  18. OAuthEntity accessToken = phase2(consumerKey, consumerSecret, email,
  19. requestToken, verifier);
  20. System.out.println("accessToken.key=" + accessToken.key);
  21. System.out.println("accessToken.secret=" + accessToken.secret);
  22. }
  23.  
  24. static final java.util.logging.Logger logger = java.util.logging.Logger
  25. .getLogger(XOAuth.class.getName());
  26. static boolean LOGGABLE = logger.isLoggable(java.util.logging.Level.INFO);
  27. static final String ENC = "utf-8";
  28. static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
  29.  
  30. /**
  31. * @param scope
  32. * @param consumerKey
  33. * @param consumerSecret
  34. * @param email
  35. * @return the request token.
  36. * @throws InvalidKeyException
  37. * @throws NoSuchAlgorithmException
  38. * @throws IOException
  39. */
  40. public static OAuthEntity phase1(String scope, String callbackUrl,
  41. String consumerKey, String consumerSecret, String email)
  42. throws java.security.InvalidKeyException,
  43. java.security.NoSuchAlgorithmException, java.io.IOException {
  44. OAuthEntity consumer = new OAuthEntity(consumerKey, consumerSecret);
  45. GoogleAccountsUrlGenerator generator = new GoogleAccountsUrlGenerator(
  46. email);
  47. return generateRequestToken(consumer, scope, callbackUrl, -1, -1,
  48. generator);
  49. }
  50.  
  51. /**
  52. * @param consumerKey
  53. * @param consumerSecret
  54. * @param email
  55. * @param requestToken
  56. * @param verifier
  57. * @return the access token.
  58. * @throws IOException
  59. * @throws NoSuchAlgorithmException
  60. * @throws InvalidKeyException
  61. */
  62. public static OAuthEntity phase2(String consumerKey, String consumerSecret,
  63. String email, OAuthEntity requestToken, String oauthVerifier)
  64. throws java.security.InvalidKeyException,
  65. java.security.NoSuchAlgorithmException, java.io.IOException {
  66. OAuthEntity consumer = new OAuthEntity(consumerKey, consumerSecret);
  67. GoogleAccountsUrlGenerator generator = new GoogleAccountsUrlGenerator(
  68. email);
  69. return getAccessToken(consumer, requestToken, oauthVerifier, generator);
  70. }
  71.  
  72. static String formatUrlParams(java.util.Map<String, String> params)
  73. throws java.io.UnsupportedEncodingException {
  74. StringBuilder b = new StringBuilder();
  75. boolean first = true;
  76. for (String key : sorted(params)) {
  77. if (first == false) {
  78. b.append('&');
  79. } else {
  80. first = false;
  81. }
  82. b.append(key).append('=').append(
  83. java.net.URLEncoder.encode(params.get(key), ENC));
  84. }
  85. return b.toString();
  86. }
  87.  
  88. static String escapeAndJoin(Iterable<String> params)
  89. throws java.io.UnsupportedEncodingException {
  90. StringBuilder b = new StringBuilder();
  91. boolean first = true;
  92. for (String s : params) {
  93. if (first == false) {
  94. b.append('&');
  95. } else {
  96. first = false;
  97. }
  98. b.append(java.net.URLEncoder.encode(s, ENC));
  99. }
  100. return b.toString();
  101. }
  102.  
  103. static String generateSignatureBaseString(String method,
  104. String requestUrlBase, java.util.Map<String, String> params)
  105. throws java.io.UnsupportedEncodingException {
  106. return escapeAndJoin(java.util.Arrays.asList(method, requestUrlBase,
  107. formatUrlParams(params)));
  108. }
  109.  
  110. static String generateHmacSha1Signature(String data, String key)
  111. throws java.security.NoSuchAlgorithmException,
  112. java.security.InvalidKeyException {
  113. javax.crypto.spec.SecretKeySpec signingKey = new javax.crypto.spec.SecretKeySpec(
  114. key.getBytes(), HMAC_SHA1_ALGORITHM);
  115. javax.crypto.Mac mac = javax.crypto.Mac
  116. .getInstance(HMAC_SHA1_ALGORITHM);
  117. mac.init(signingKey);
  118. return byteArrayToBase64(mac.doFinal(data.getBytes()));
  119. }
  120.  
  121. static String generateOauthSignature(String baseString,
  122. String consumerSecret, String tokenSecret)
  123. throws java.security.InvalidKeyException,
  124. java.security.NoSuchAlgorithmException,
  125. java.io.UnsupportedEncodingException {
  126. return generateHmacSha1Signature(baseString,
  127. escapeAndJoin(java.util.Arrays.asList(consumerSecret,
  128. tokenSecret)));
  129. }
  130.  
  131. static java.util.Map<String, String> parseUrlParamString(String paramString)
  132. throws java.io.UnsupportedEncodingException {
  133. String[] pairs = paramString.split("&");
  134. java.util.Map<String, String> map = new java.util.HashMap<String, String>(
  135. pairs.length);
  136. for (String pair : pairs) {
  137. String[] split = pair.split("=");
  138. map.put(split[0], java.net.URLDecoder.decode(split[1], ENC));
  139. }
  140. return map;
  141. }
  142.  
  143. static class OAuthEntity {
  144. String secret;
  145. String key;
  146.  
  147. OAuthEntity(String key, String secret) {
  148. this.key = key;
  149. this.secret = secret;
  150. }
  151. }
  152.  
  153. static class GoogleAccountsUrlGenerator {
  154. String appsDomain;
  155.  
  156. GoogleAccountsUrlGenerator(String email) {
  157. int indexOf = email.indexOf('@');
  158. if (indexOf <= 0) {
  159. return;
  160. }
  161. String domain = email.substring(indexOf + 1).toLowerCase();
  162. if (domain.equals("gmail.com") == false
  163. && domain.equals("googlemail.com") == false) {
  164. appsDomain = domain;
  165. }
  166. }
  167.  
  168. String getRequestTokenUrl() {
  169. return "https://www.google.com/accounts/OAuthGetRequestToken";
  170. }
  171.  
  172. String getAuthorizeTokenUrl() {
  173. if (appsDomain != null) {
  174. return String.format(
  175. "https://www.google.com/a/%s/OAuthAuthorizeToken",
  176. appsDomain);
  177. } else {
  178. return "https://www.google.com/accounts/OAuthAuthorizeToken";
  179. }
  180. }
  181.  
  182. String getAccessTokenUrl() {
  183. return "https://www.google.com/accounts/OAuthGetAccessToken";
  184. }
  185. }
  186.  
  187. static void fillInCommonOauthParams(java.util.Map<String, String> params,
  188. OAuthEntity consumer, long nonce, long timestamp) {
  189. params.put("oauth_consumer_key", consumer.key);
  190. if (nonce < 0) {
  191. nonce = (long) (Math.random() * Math.pow(2.0, 64.0));
  192. }
  193. params.put("oauth_nonce", String.valueOf(nonce));
  194. params.put("oauth_signature_method", "HMAC-SHA1");
  195. params.put("oauth_version", "1.0");
  196. if (timestamp < 0) {
  197. timestamp = System.currentTimeMillis() / 1000;
  198. }
  199. params.put("oauth_timestamp", String.valueOf(timestamp));
  200. }
  201.  
  202. static OAuthEntity generateRequestToken(OAuthEntity consumer, String scope,
  203. String callbackUrl, long nonce, long timestamp,
  204. GoogleAccountsUrlGenerator urlGenerator)
  205. throws java.security.InvalidKeyException,
  206. java.security.NoSuchAlgorithmException, java.io.IOException {
  207. java.util.Map<String, String> params = new java.util.HashMap<String, String>();
  208. fillInCommonOauthParams(params, consumer, nonce, timestamp);
  209. params.put("oauth_callback", callbackUrl); // for installed application.
  210. params.put("scope", scope);
  211. String requestUrl = urlGenerator.getRequestTokenUrl();
  212. OAuthEntity token = new OAuthEntity(null, "");
  213. String baseString = generateSignatureBaseString("GET", requestUrl,
  214. params);
  215. String signature = generateOauthSignature(baseString, consumer.secret,
  216. token.secret);
  217. params.put("oauth_signature", signature);
  218. String url = requestUrl + "?" + formatUrlParams(params);
  219. String response = readFromUrl(url);
  220. java.util.Map<String, String> responseParams = parseUrlParamString(response);
  221. java.util.Iterator<java.util.Map.Entry<String, String>> i = responseParams
  222. .entrySet().iterator();
  223. while (i.hasNext()) {
  224. java.util.Map.Entry<String, String> next = i.next();
  225. if (LOGGABLE) {
  226. logger.info(next.getKey() + "=" + next.getValue());
  227. }
  228. }
  229. token = new OAuthEntity(responseParams.get("oauth_token"),
  230. responseParams.get("oauth_token_secret"));
  231. if (LOGGABLE) {
  232. logger.info("To authorize token, "
  233. + "visit this url and follow the directions "
  234. + "to generate a verification code:");
  235. logger.info(String.format(" %s?oauth_token=%s", urlGenerator
  236. .getAuthorizeTokenUrl(), java.net.URLEncoder.encode(
  237. responseParams.get("oauth_token"), ENC)));
  238. }
  239. return token;
  240. }
  241.  
  242. static OAuthEntity getAccessToken(OAuthEntity consumer,
  243. OAuthEntity requestToken, String oauthVerifier,
  244. GoogleAccountsUrlGenerator urlGenerator)
  245. throws java.security.InvalidKeyException,
  246. java.security.NoSuchAlgorithmException, java.io.IOException {
  247. java.util.Map<String, String> params = new java.util.HashMap<String, String>();
  248. fillInCommonOauthParams(params, consumer, -1, -1);
  249. params.put("oauth_token", requestToken.key);
  250. params.put("oauth_verifier", oauthVerifier);
  251. String requestUrl = urlGenerator.getAccessTokenUrl();
  252. String baseString = generateSignatureBaseString("GET", requestUrl,
  253. params);
  254. String signature = generateOauthSignature(baseString, consumer.secret,
  255. requestToken.secret);
  256. params.put("oauth_signature", signature);
  257. String url = requestUrl + "?" + formatUrlParams(params);
  258. String response = readFromUrl(url);
  259. java.util.Map<String, String> responseParams = parseUrlParamString(response);
  260. java.util.Iterator<java.util.Map.Entry<String, String>> i = responseParams
  261. .entrySet().iterator();
  262. while (i.hasNext()) {
  263. java.util.Map.Entry<String, String> next = i.next();
  264. if (LOGGABLE) {
  265. logger.info(next.getKey() + "=" + next.getValue());
  266. }
  267. }
  268. OAuthEntity token = new OAuthEntity(responseParams.get("oauth_token"),
  269. responseParams.get("oauth_token_secret"));
  270. return token;
  271. }
  272.  
  273. static String generateXOauthString(OAuthEntity consumer,
  274. OAuthEntity accessToken, String user, String proto,
  275. String xoauthRequestorId, long nonce, long timestamp)
  276. throws java.io.UnsupportedEncodingException,
  277. java.security.InvalidKeyException,
  278. java.security.NoSuchAlgorithmException {
  279. String method = "GET";
  280. java.util.Map<String, String> urlParams = new java.util.HashMap<String, String>();
  281. if (xoauthRequestorId != null) {
  282. urlParams.put("xoauth_requestor_id", xoauthRequestorId);
  283. }
  284. java.util.Map<String, String> oauthParams = new java.util.HashMap<String, String>();
  285. fillInCommonOauthParams(oauthParams, consumer, nonce, timestamp);
  286. if (accessToken.key != null) {
  287. oauthParams.put("oauth_token", accessToken.key);
  288. }
  289. java.util.Map<String, String> signedParams = new java.util.HashMap<String, String>();
  290. signedParams.putAll(oauthParams);
  291. signedParams.putAll(urlParams);
  292. String requestUrlBase = String.format(
  293. "https://mail.google.com/mail/b/%s/%s/", user, proto);
  294. String baseString = generateSignatureBaseString(method, requestUrlBase,
  295. signedParams);
  296. if (LOGGABLE) {
  297. logger.info("signature base string:\n" + baseString + "\n");
  298. }
  299. String signature = generateOauthSignature(baseString, consumer.secret,
  300. accessToken.secret);
  301. oauthParams.put("oauth_signature", signature);
  302. java.util.List<String> formattedParams = new java.util.ArrayList<String>();
  303. for (String key : sorted(oauthParams)) {
  304. formattedParams.add(key + "="
  305. + java.net.URLEncoder.encode(oauthParams.get(key), ENC));
  306. }
  307. StringBuilder b = new StringBuilder();
  308. boolean first = true;
  309. for (String s : formattedParams) {
  310. if (first == false) {
  311. b.append(',');
  312. } else {
  313. first = false;
  314. }
  315. b.append(s);
  316. }
  317. String paramList = b.toString();
  318. String requestUrl;
  319. if (urlParams != null && urlParams.isEmpty() == false) {
  320. requestUrl = requestUrlBase + "?" + formatUrlParams(urlParams);
  321. } else {
  322. requestUrl = requestUrlBase;
  323. }
  324. String preencoded = method + " " + requestUrl + " " + paramList;
  325. if (LOGGABLE) {
  326. logger.info("xoauth string (before base64-encoding):\n"
  327. + preencoded + "\n");
  328. }
  329. return preencoded;
  330. }
  331.  
  332. static java.util.List<String> sorted(java.util.Map<String, String> map) {
  333. java.util.List<String> list = new java.util.ArrayList<String>(map
  334. .size());
  335. list.addAll(map.keySet());
  336. java.util.Collections.sort(list);
  337. return list;
  338. }
  339.  
  340. static String readFromUrl(String urlString) throws java.io.IOException {
  341. java.net.URL url = new java.net.URL(urlString);
  342. java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url
  343. .openConnection();
  344. connection.setRequestMethod("GET");
  345. if (LOGGABLE) {
  346. logger.info("read from: " + urlString);
  347. logger.info("response code: " + connection.getResponseCode());
  348. logger.info("content length: " + connection.getContentLength());
  349. }
  350. java.io.InputStream is = connection.getInputStream();
  351. java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
  352. byte[] bs = new byte[1024];
  353. int size = 0;
  354. while ((size = is.read(bs)) != -1) {
  355. baos.write(bs, 0, size);
  356. }
  357. return new String(baos.toByteArray());
  358. }
  359.  
  360. /**
  361. * @see java.util.prefs.Base64#byteArrayToBase64(byte[], boolean)
  362. */
  363. static String byteArrayToBase64(byte[] bytes) {
  364. int aLen = bytes.length;
  365. int numFullGroups = aLen / 3;
  366. int numBytesInPartialGroup = aLen - 3 * numFullGroups;
  367. int resultLen = 4 * ((aLen + 2) / 3);
  368. StringBuilder b = new StringBuilder(resultLen);
  369.  
  370. int inCursor = 0;
  371. for (int i = 0; i < numFullGroups; i++) {
  372. int byte0 = bytes[inCursor++] & 0xff;
  373. int byte1 = bytes[inCursor++] & 0xff;
  374. int byte2 = bytes[inCursor++] & 0xff;
  375. b.append(intToBase64[byte0 >> 2]);
  376. b.append(intToBase64[(byte0 << 4) & 0x3f | (byte1 >> 4)]);
  377. b.append(intToBase64[(byte1 << 2) & 0x3f | (byte2 >> 6)]);
  378. b.append(intToBase64[byte2 & 0x3f]);
  379. }
  380.  
  381. if (numBytesInPartialGroup != 0) {
  382. int byte0 = bytes[inCursor++] & 0xff;
  383. b.append(intToBase64[byte0 >> 2]);
  384. if (numBytesInPartialGroup == 1) {
  385. b.append(intToBase64[(byte0 << 4) & 0x3f]);
  386. b.append("==");
  387. } else {
  388. int byte1 = bytes[inCursor++] & 0xff;
  389. b.append(intToBase64[(byte0 << 4) & 0x3f | (byte1 >> 4)]);
  390. b.append(intToBase64[(byte1 << 2) & 0x3f]);
  391. b.append('=');
  392. }
  393. }
  394. return b.toString();
  395. }
  396.  
  397. static final char intToBase64[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  398. 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
  399. 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
  400. 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
  401. 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
  402. '8', '9', '+', '/' };
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement