· 6 years ago · Apr 28, 2019, 08:24 PM
1/*
2This snippet uses variables.get() for oauth token/secret which means
3you need to store those in the Shared Environment as a raw text.
4OR you may also want to consider using get_secret() instead.
5*/
6const oauth_consumer_key = variables.get("oauth_consumer_key");
7const oauth_consumer_secret = variables.get("oauth_consumer_secret");
8const oauth_token = variables.get("oauth_token");
9const oauth_secret = variables.get("oauth_secret");
10const oauth_signing_key = oauth_consumer_secret + '&' + oauth_secret;
11
12// create random oauth_nonce string
13const random_source = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
14var oauth_nonce = '';
15for (var i = 0; i < 32; i++) {
16 oauth_nonce += random_source.charAt(Math.floor(Math.random() * random_source.length));
17}
18
19const oauth_parameter_string_object = {};
20oauth_parameter_string_object.oauth_consumer_key = oauth_consumer_key;
21oauth_parameter_string_object.oauth_token = oauth_token;
22oauth_parameter_string_object.oauth_nonce = encodeURIComponent(encode_base64(oauth_nonce));
23oauth_parameter_string_object.oauth_signature_method = 'HMAC-SHA1';
24oauth_parameter_string_object.oauth_version = '1.0';
25oauth_parameter_string_object.oauth_timestamp = moment().unix();
26
27// for Authorization request header (copy object)
28const oauth_authorization_header_object = {};
29for (var key in oauth_parameter_string_object) {
30 oauth_authorization_header_object[key] = oauth_parameter_string_object[key];
31}
32
33// parse request.params
34for (var i = 0; i < request.params.length; i++) {
35 oauth_parameter_string_object[encodeURIComponent(request.params[i].name)] = encodeURIComponent(request.params[i].value);
36}
37
38// sort object by key
39const oauth_parameter_string_object_ordered = {};
40Object.keys(oauth_parameter_string_object).sort().forEach(function(key) {
41 oauth_parameter_string_object_ordered[key] = oauth_parameter_string_object[key];
42});
43
44// convert object into array
45const oauth_parameter_string_array = [];
46for (var key in oauth_parameter_string_object_ordered) {
47 oauth_parameter_string_array.push(key + "=" + oauth_parameter_string_object_ordered[key]);
48}
49
50// generate parameter string
51const oauth_parameter_string = oauth_parameter_string_array.join('&');
52
53// generate base string
54const host = request.scheme + '://' + request.host;
55const oauth_base_string = request.method + '&' + encodeURIComponent(host + request.path) + '&' + encodeURIComponent(oauth_parameter_string);
56
57// generate signature
58const oauth_signature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA1(oauth_base_string, oauth_signing_key));
59
60oauth_authorization_header_object.oauth_signature = encodeURIComponent(oauth_signature);
61
62// convert object into array (for Authorization header string)
63const oauth_authorization_header_array = [];
64for (var key in oauth_authorization_header_object) {
65 oauth_authorization_header_array.push(key + '=' + '"' + oauth_authorization_header_object[key] + '"');
66}
67
68const oauth_authorization_header = oauth_authorization_header_array.join(', ');
69
70// generate Authorization header
71request.headers.Authorization = 'OAuth ' + oauth_authorization_header;
72
73
74/*
75Escape URI parameters using encodeURIComponent
76Runscope does encode URI parameters in a similar fashion to encodeURI by default.
77*/
78if(request.params.length !== 0) {
79 // parse request.params
80 const request_parameter_array = [];
81 for (var i = 0; i < request.params.length; i++) {
82 request_parameter_array[i] = request.params[i].name + '=' + encodeURIComponent(request.params[i].value);
83 }
84 const request_parameter_string = request_parameter_array.join('&');
85
86 request.url = host + request.path + '?' + request_parameter_string;
87}