· 6 years ago · May 22, 2019, 06:48 PM
1package pl.edu.amu.service;
2
3import org.apache.commons.codec.binary.Base64;
4import org.apache.http.NameValuePair;
5import org.apache.http.client.utils.URLEncodedUtils;
6import org.apache.http.message.BasicNameValuePair;
7import org.springframework.beans.factory.annotation.Autowired;
8import org.springframework.stereotype.Service;
9import pl.edu.amu.PropertiesLoader;
10
11import javax.crypto.Mac;
12import javax.crypto.SecretKey;
13import javax.crypto.spec.SecretKeySpec;
14import java.io.UnsupportedEncodingException;
15import java.net.URLEncoder;
16import java.security.InvalidKeyException;
17import java.security.NoSuchAlgorithmException;
18import java.util.ArrayList;
19import java.util.List;
20
21import static io.restassured.RestAssured.when;
22
23@Service
24public class AuthorizationService {
25
26 private static final String ENC = "UTF-8";
27 private static final String HMAC_SHA1 = "HmacSHA1";
28 private static Base64 base64 = new Base64();
29 @Autowired
30 private PropertiesLoader propertiesLoader;
31
32 public String authorize(String oauth_token, String oauth_token_secret, String oauth_verifier) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
33 List<NameValuePair> queryParams = new ArrayList<>();
34 queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey()));
35 queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000)));
36 queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1"));
37 queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)));
38 queryParams.add(new BasicNameValuePair("oauth_token", oauth_token));
39 queryParams.add(new BasicNameValuePair("oauth_verifier", oauth_verifier));
40 queryParams.add(new BasicNameValuePair("oauth_version", "1.0"));
41 String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/oauth/access_token", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret);
42 queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature));
43 String url = "/oauth/access_token?" + URLEncodedUtils.format(queryParams, ENC);
44
45 return when().get(url).body().asString();
46 }
47
48 public String requestToken(String oauth_callback) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
49 List<NameValuePair> queryParams = new ArrayList<>();
50 queryParams.add(new BasicNameValuePair("oauth_callback", oauth_callback));
51 queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey()));
52 queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000)));
53 queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1"));
54 queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)));
55 queryParams.add(new BasicNameValuePair("oauth_version", "1.0"));
56 String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/oauth/request_token", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), "");
57 queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature));
58 String url = "/oauth/request_token?" + URLEncodedUtils.format(queryParams, ENC);
59
60 String tokens = when().get(url).body().asString();
61
62 return propertiesLoader.getUsosApiURL() + "/oauth/authorize?" + tokens;
63 }
64
65 public String logOut(String oauth_token, String oauth_token_secret) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
66 List<NameValuePair> queryParams = new ArrayList<>();
67 queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey()));
68 queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000)));
69 queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1"));
70 queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)));
71 queryParams.add(new BasicNameValuePair("oauth_token", oauth_token));
72 queryParams.add(new BasicNameValuePair("oauth_version", "1.0"));
73 String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/oauth/revoke_token", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret);
74 queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature));
75 String url = "/oauth/revoke_token?" + URLEncodedUtils.format(queryParams, ENC);
76
77 String loggedOut = when().get(url).body().asString();
78
79 return loggedOut;
80 }
81
82
83
84
85 public String getSignature(String method, String url, String params, String secret_token)
86 throws UnsupportedEncodingException, NoSuchAlgorithmException,
87 InvalidKeyException {
88
89 StringBuilder base = new StringBuilder();
90 base.append(method);
91 base.append("&");
92 base.append(url);
93 base.append("&");
94 base.append(params);
95
96 byte[] keyBytes = (propertiesLoader.getSecret() + "&" + secret_token).getBytes(ENC);
97
98 SecretKey key = new SecretKeySpec(keyBytes, HMAC_SHA1);
99
100 Mac mac = Mac.getInstance(HMAC_SHA1);
101 mac.init(key);
102
103 // encode it, base64 it, change it to string and return.
104 return new String(base64.encode(mac.doFinal(base.toString().getBytes(
105 ENC))), ENC).trim();
106 }
107}