· 7 years ago · Aug 13, 2018, 05:32 PM
1public class OAuth {
2public static void A(){
3 Http h = new Http();
4 HttpRequest req = new HttpRequest();
5 req.setMethod('GET');
6 req.setEndpoint('https://api.xero.com/oauth/RequestToken?');
7 // string url = 'https://api.xero.com/oauth/RequestToken?';
8 String consumerKey = '0JWSFVEECOXX19UGSDU9IEAQYWLVCX';
9 String consumerSecret = '8P3BOVVV5LPHV2QIDMLKPWCK5IBIP5';
10 req = signRequest(req,consumerKey,consumerSecret);
11 HttpResponse res = h.send(req);
12 String picklistValues = res.getBody();
13 System.debug('res ----- '+res.getBody());
14 String oauth_token = picklistValues.substringBefore('&oauth_token_secret=');
15 System.debug('oauth_token ------ '+oauth_token);
16
17 //Get verifier
18 Http h1 = new Http();
19 HttpRequest req1 = new HttpRequest();
20 String endPoint = 'https://api.xero.com/oauth/Authorize?'+oauth_token;
21 System.debug('endPoint --- '+endPoint);
22 req1.setMethod('GET');
23 req1.setEndpoint('endPoint');
24 //req1.setEndpoint('https://api.xero.com/oauth/Authorize?oauth_token=5L0TLEEJJBNPBK6ENLNLEZWIUYOTOP&oauth_callback=http://localhost:8500/Xero-CFML-master-4/example/public/callback.cfm?key=HOHDXOD4UB7ONRIEOOZK4QLSOQTQWP&secret=IXBAQE2HH8XO8YC8O99EAP24CSPSCM&token=5L0TLEEJJBNPBK6ENLNLEZWIUYOTOP&token_secret=KVBVNKCPZSX0IJDYSTGMW742QJQAIG&endpoint=https://api.xero.com/oauth/Authorize');
25 HttpResponse res1 = h1.send(req);
26 System.debug('res1 ---- '+res1);
27 System.debug('res1 ----- '+res1.getBody());
28}
29public static HttpRequest signRequest(HttpRequest req, String consumerKey, String consumerSecret) {
30 String nonce = String.valueOf(Crypto.getRandomLong());
31 String timestamp = String.valueOf(DateTime.now().getTime() / 1000);
32
33 Map<String,String> parameters = new Map<String,String>();
34 parameters.put('oauth_signature_method','HMAC-SHA1');
35 parameters.put('oauth_consumer_key', consumerKey);
36 parameters.put('oauth_timestamp', timestamp);
37 parameters.put('oauth_nonce', nonce);
38
39 String signature = generateSignature(req, consumerSecret, parameters);
40 System.debug('signature ---- '+signature);
41 String header = generateHeader(signature, parameters);
42 req.setHeader('Authorization', header);
43 System.debug('req ----- '+req);
44
45 return req;
46}
47
48private static String generateHeader(String signature, Map<String,String> parameters) {
49 String header = 'OAuth ';
50 for (String key : parameters.keySet()) {
51 header = header + key + '="'+parameters.get(key)+'", ';
52 }
53 return header + 'oauth_signature="' + signature + '"';
54}
55
56private static String generateSignature(HttpRequest req, String consumerSecret, Map<String,String> parameters) {
57 String s = createBaseString(req, parameters);
58 System.debug('s 111------- '+s);
59 Blob sig = Crypto.generateMac('HmacSHA1', Blob.valueOf(s) , Blob.valueOf(consumerSecret + '&'));
60 return EncodingUtil.urlEncode(EncodingUtil.base64encode(sig), 'UTF-8');
61}
62
63private static String createBaseString(HttpRequest req, Map<String,String> parameters) {
64 Map<String,String> p = parameters.clone();
65 if(req.getMethod().equalsIgnoreCase('post') && req.getBody()!=null && req.getHeader('Content-Type')=='application/x-www-form-urlencoded') {
66 System.debug('in if --- ');
67 p.putAll(getUrlParams(req.getBody()));
68 System.debug('req.getBody() ---- '+req.getBody());
69 }
70 String host = req.getEndpoint();
71 System.debug('host --- '+host);
72 Integer n = host.indexOf('?');
73 System.debug('n ----- '+n);
74 if(n>-1) {
75 System.debug('host.substring(n+1)) ---- '+host.substring(n+1));
76 p.putAll(getUrlParams(host.substring(n+1)));
77 host = host.substring(0,n);
78 System.debug('host 11--- '+host);
79 }
80 System.debug('p ---- '+p);
81 List<String> keys = new List<String>();
82 keys.addAll(p.keySet());
83 keys.sort();
84 String s = keys.get(0)+'='+p.get(keys.get(0));
85 for(Integer i=1;i<keys.size();i++) {
86 s = s + '&' + keys.get(i)+'='+p.get(keys.get(i));
87 }
88 System.debug('s 2222 --- '+s);
89 // According to OAuth spec, host string should be lowercased, but Google and LinkedIn
90 // both expect that case is preserved.
91 return req.getMethod().toUpperCase()+ '&' +EncodingUtil.urlEncode(host, 'UTF-8') + '&' +EncodingUtil.urlEncode(s, 'UTF-8');
92}
93
94private static Map<String,String> getUrlParams(String value) {
95 System.debug('value ---- '+value);
96 Map<String,String> res = new Map<String,String>();
97 if(value==null || value=='') {
98 return res;
99 }
100 for(String s : value.split('&')) {
101 System.debug('getUrlParams: '+s);
102 List<String> kv = s.split('=');
103 if(kv.size()>1) {
104 System.debug('getUrlParams: -> '+kv[0]+','+kv[1]);
105 res.put(kv[0],kv[1]);
106 }
107 }
108 return res;
109}